From: Chet Ramey Date: Thu, 3 Jul 2025 20:22:52 +0000 (-0400) Subject: Readline-8.3 distribution sources and documentation X-Git-Tag: readline-8.3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=447b8290b3e2e2d117dc8e9cdb83b0dc6448a638;p=thirdparty%2Freadline.git Readline-8.3 distribution sources and documentation --- diff --git a/CHANGELOG b/CHANGELOG index b2fcb53..783a097 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1448,3 +1448,47 @@ configure.ac 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 + + 11/25/2022 + ---------- +gettimeofday.c + - add file from bash's lib/sh/gettimeofday.c, only compiled in if + HAVE_GETTIMEOFDAY is not defined + +Makefile.in + - gettimeofday.o: link in, it will not define any symbols if + HAVE_GETTIMEOFDAY is defined. This is for systems like _WIN32 that + don't have gettimeofday() + + 3/6/2024 + -------- +config.h.in + - added more defines that bash aclocal.m4 BASH_CHECK_MULTIBYTE checks + for + + 5/10 + ---- +examples/rlfe + - lots of updates to configure.ac to make it build on modern systems + and more-or-less work with autoconf-2.72 (still warnings about + obsolete macros) + - add prototypes and declarations to pty.c + + 5/11 + ---- +configure.ac + - AC_PROG_GCC_TRADITIONAL: remove + - need to note in CHANGES that configure now supports --enable-year2038. + THIS IS AN ABI CHANGE IF YOU ENABLE IT + + 7/7 + --- +configure.ac + - add ncursesw as a possible value for TERMCAP_PKG_CONFIG_LIB, with + corresponding changes to aclocal.m4, which is shared with bash + + 7/24 + ---- +configure.ac,Makefile.in + - STYLE_CFLAGS: set like bash if we're using gcc or clang; add to + CCFLAGS so we can compile -Wno-parentheses by default diff --git a/CHANGES b/CHANGES index eb54caa..8c89f1e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,174 @@ +This document details the changes between this version, readline-8.3, and +the previous version, readline-8.2. + +1. Changes to Readline + +a. Fixed a bug in clearing the visible line structure before redisplay. + +b. Fix a bug where setlocale(3) returning NULL caused a crash. + +c. Fixed signal checking in callback mode to handle signals that arrive before + readline restore's the application's signal handlers. + +d. Fixed a bug with word completion where the directory name needs to be + dequoted and tilde-expanded. + +e. Fixed a bug that caused compilation to fail on systems with select but not + pselect. + +f. System-specific changes for: WIN32, z/OS, Cygwin, MSYS + +g. Fixed a bug that caused word completion mismatches if the quoted text the + user typed was longer than the unquoted match. + +h. Fixes for freeing undo lists that might appear in history list entries + after non-incremental searches. + +i. Fixes for some errors revealed by address sanitizer. + +j. In vi mode, if an `f' or `F' move command associated with a `c' or `C' + command fails, don't enter insert mode. + +k. Fixed bug with truncating a history file containing timestamps that caused + the timestamp associated with the first history entry not to be written. + +l. Fix vi-mode so that a motion command attached to d/D, y/Y, or t/T must + consume or delete at least one character. + +m. Fix a redisplay error when displaying meta characters as octal sequences + and other C locale issues. + +n. Fix error that caused characters composing an incomplete multibyte + character not to be inserted into the line. + +o. In callback mode, let the application echo the signal characters (e.g., ^C) + when the application's signal handlers are installed. + +p. Added some support for lines that consume more than the physical number of + screen lines. + +q. Make sure dump-variables returns the string values for active-region-start-color + and active-region-end-color if they're set. + +r. Fixes to how characters between 128 and 159 are printed when displaying + macro values (use symbolic notation instead of directly printing the + character). + +s. Don't convert meta characters that contain NULL (\M-\C-@) to actual NULs, + which prematurely terminates the macro value. + +t. Fix typo in the readline color prefix extension that it uses for coloring + filename prefixes when displaying possible completions. + +u. Call the filename rewrite hook on the word being completed before comparing + it against possible completions from the file system to get consistent + strings. + +v. Fix infinite recursion that can happen if someone binds a key that doesn't + have a different upper and lower case represenation to do-lowercase-version. + +w. Check for non-ANSI (dumb) terminals a little more thoroughly. + +x. Don't attempt to history-expand the `quick substitution' character at the + beginning of a line if the application has set the quoting state to single + quotes. + +y. Fix small memory leak if non-incremental or incremental search is + interrupted by a signal. + +z. Loading very large history files should be much faster. + +aa. Retry opening startup files if the open is interrupted by a signal + and is not automatically restarted. + +bb. Make sure the bracketed-paste input buffer is null-terminated when read + returns an error. + +cc. Fixed a small memory leak in execute-named-command if the command doesn't + exist or the function doesn't return. + +dd. Fix for attempting to change case of invalid multibyte characters. + +ee. Fix for possible completions that compare identically when using case- + insensitive completion but have different byte lengths. + +ff. Fix to make non-incremental searches use undo lists and set the history + position the same way as incremental searches. + +gg. Don't check for signals when handling a received signal. + +hh. Fix off-by-one error when tokenizing words like $((expr)) while performing + history expansion. + +ii. Fixes for incremental searches and redisplay in the C locale. + +jj. Fixes for some use-after-free of the undo list errors when stacking multiple + commands that use rl_maybe_replace_line to save changes to a history entry. + +kk. Fixes to ensure that completion-prefix-display-length and + colored-completion-prefix are mutually exclusive. + +ll. Fixed a bug that allowed a history search to change the current history + list position. + +mm. Fixed a bug that allowed ^G to retain a saved command to execute. + +nn. Updates to new export-completions command to allow filename suffixes. + +oo. Fixed a redisplay bug with prompts containing multiple sequences of + invisible characters that are longer than the screen width. + +pp. The history library no longer skips blank lines while it is reading a + multiline history entry from a history file. + +2. New Features in Readline + +a. Output a newline if there is no prompt and readline reads an empty line. + +b. The history library falls back to stdio when writing the history list if + mmap fails. + +c. New bindable variable `search-ignore-case', causes readline to perform + case-insensitive incremental and non-incremental history searches. + +d. rl_full_quoting_desired: new application-settable variable, causes all + completions to be quoted as if they were filenames. + +e. rl_macro_display_hook: new application-settable function pointer, used if + the application wants to print macro values itself instead of letting + readline do it + +f. rl_reparse_colors: new application-callable function, reparses $LS_COLORS + (presumably after the user changes it) + +g. rl_completion_rewrite_hook: new application-settable function pointer, + called to modify the word being completed before comparing it against + pathnames from the file system. + +h. execute-named-command: a new bindable command that reads the name of a + readline command from the standard input and executes it. Bound to M-x + in emacs mode by default. + +i. Incremental and non-incremental searches now allow ^V/^Q (or, in the former + case, anything bound to quoted-insert) to quote characters in the search + string. + +j. Documentation has been significantly updated. + +k. New `force-meta-prefix' bindable variable, which forces the use of ESC as + the meta prefix when using "\M-" in key bindings instead of overloading + convert-meta. + +l. The default value for `readline-colored-completion-prefix' no longer has a + leading `.'; the original report was based on a misunderstanding. + +m. There is a new bindable command, `export-completions', which writes the + possible completions for a word to the standard output in a defined format. + +n. Readline can reset its idea of the screen dimensions when executing after + a SIGCONT. + +------------------------------------------------------------------------------- This document details the changes between this version, readline-8.2, and the previous version, readline-8.1. diff --git a/INSTALL b/INSTALL index 293ef70..52ba8eb 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ Basic Installation ================== -These are installation instructions for Readline-8.2. +These are installation instructions for Readline. The simplest way to compile readline is: @@ -14,12 +14,17 @@ The simplest way to compile readline is: Running `configure' takes some time. While running, it prints some messages telling which features it is checking for. + If you want to build readline in a directory other than the source + directory, just run `configure' using a full pathname, for instance: + + bash /usr/local/src/readline/readline-8.3/configure + 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. + and history libraries. If supported, this will build the shared + readline and history libraries also. See below for instructions on + compiling the other parts of the distribution. Typing `make everything' + will build the static and shared libraries (if supported) and the + example programs. 3. Type `make install' to install the static readline and history libraries, the readline include files, the documentation, and, if @@ -44,6 +49,27 @@ results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). +To find out more about the options and arguments that the `configure' +script understands, type + + bash-4.2$ ./configure --help + +at a shell prompt in your readline source directory. + +If you want to build readline in a directory separate from the source +directory - to build for multiple architectures, for example - just use +the full path to the configure script. The following commands will +build readline in a directory under `/usr/local/build' from the source code +in `/usr/local/src/readline/readline-8.3': + + mkdir /usr/local/build/readline-8.3 + cd /usr/local/build/readline-8.3 + bash /usr/local/src/readline/readline-8.3/configure + make + +See `Compiling For Multiple Architectures' below for more information +about building in a directory separate from the source. + 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 @@ -93,12 +119,11 @@ 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'. +`/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. diff --git a/MANIFEST b/MANIFEST index db689b3..73e95a8 100644 --- a/MANIFEST +++ b/MANIFEST @@ -82,6 +82,7 @@ vi_keymap.c f vi_mode.c f xfree.c f xmalloc.c f +gettimeofday.c f history.c f histexpand.c f histfile.c f @@ -89,14 +90,14 @@ histsearch.c f patchlevel f shlib/Makefile.in f support/config.guess f -support/config.rpath f +support/config.rpath f 755 support/config.sub f -support/install.sh f -support/mkdirs f +support/install-sh f 755 +support/mkdirs f 755 support/mkdist f -support/mkinstalldirs f +support/mkinstalldirs f 755 support/shobj-conf f -support/shlib-install f +support/shlib-install f 755 support/wcwidth.c f doc/Makefile.in f doc/texinfo.tex f @@ -111,8 +112,8 @@ doc/hstech.texi f doc/hsuser.texi f doc/readline.3 f doc/history.3 f -doc/texi2dvi f -doc/texi2html f +doc/texi2dvi f 755 +doc/texi2html f 755 examples/Makefile.in f examples/excallback.c f examples/fileman.c f @@ -125,6 +126,8 @@ examples/rlevent.c f examples/rlkeymaps.c f examples/rltest.c f examples/rl-callbacktest.c f +examples/rl-callbacktest2.c f +examples/rl-callbacktest3.c f examples/rl-timeout.c f examples/rl-test-timeout f examples/rl.c f @@ -142,17 +145,19 @@ 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/configure.ac 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 +examples/rlwrap-0.46.1.tar.gz f # formatted documentation, from MANIFEST.doc doc/readline.ps f doc/history.ps f doc/rluserman.ps f +doc/readline_3.ps f +doc/history_3.ps f doc/readline.dvi f doc/history.dvi f doc/rluserman.dvi f @@ -164,8 +169,8 @@ 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/readline_3.pdf f +doc/history_3.pdf f doc/history.pdf f doc/readline.pdf f doc/rluserman.pdf f diff --git a/Makefile.in b/Makefile.in index 2120daa..54bd19a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,6 +1,6 @@ ## -*- text -*- ## # Master Makefile for the GNU readline library. -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2024 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 @@ -37,6 +37,8 @@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ +install_sh = @install_sh@ + CC = @CC@ RANLIB = @RANLIB@ AR = @AR@ @@ -78,6 +80,7 @@ CFLAGS = @CFLAGS@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"' @BRACKETED_PASTE@ CPPFLAGS = @CPPFLAGS@ +STYLE_CFLAGS = @STYLE_CFLAGS@ DEFS = @DEFS@ @CROSS_COMPILE@ LOCAL_DEFS = @LOCAL_DEFS@ @@ -87,7 +90,7 @@ TERMCAP_LIB = @TERMCAP_LIB@ INCLUDES = -I. -I$(srcdir) XCCFLAGS = $(ASAN_CFLAGS) $(DEFS) $(LOCAL_DEFS) $(INCLUDES) $(CPPFLAGS) -CCFLAGS = $(XCCFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) +CCFLAGS = $(XCCFLAGS) $(LOCAL_CFLAGS) $(CFLAGS) $(STYLE_CFLAGS) # could add -Werror here GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \ @@ -98,6 +101,9 @@ GCC_LINT_CFLAGS = $(XCCFLAGS) $(GCC_LINT_FLAGS) @CFLAGS@ @LOCAL_CFLAGS@ ASAN_XCFLAGS = -fsanitize=address -fno-omit-frame-pointer ASAN_XLDFLAGS = -fsanitize=address +UBSAN_XCFLAGS = -fsanitize=undefined -fsanitize-recover -fstack-protector +UBSAN_XLDFLAGS = -fsanitize=undefined + install_examples = @EXAMPLES_INSTALL_TARGET@ .c.o: @@ -120,7 +126,7 @@ CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.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 + $(srcdir)/mbutil.c $(srcdir)/gettimeofday.c # The header files for this library. HSOURCES = $(srcdir)/readline.h $(srcdir)/rldefs.h $(srcdir)/chardefs.h \ @@ -139,7 +145,7 @@ 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 + xmalloc.o xfree.o compat.o gettimeofday.o # The texinfo files which document this library. DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo @@ -167,7 +173,7 @@ all: $(TARGETS) everything: all examples asan: - ${MAKE} ${MFLAGS} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' everything + ${MAKE} ASAN_CFLAGS='${ASAN_XCFLAGS}' ASAN_LDFLAGS='${ASAN_XLDFLAGS}' everything static: $(STATIC_LIBS) @@ -191,7 +197,7 @@ 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 + $(MAKE) CCFLAGS='$(GCC_LINT_CFLAGS)' static Makefile makefile: config.status $(srcdir)/Makefile.in CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status @@ -216,15 +222,15 @@ stamp-h: config.status $(srcdir)/config.h.in shared: force -test -d shlib || mkdir shlib - ( cd shlib ; ${MAKE} ${MFLAGS} all ) + ( cd shlib ; ${MAKE} all ) documentation: force -test -d doc || mkdir doc - -( cd doc && $(MAKE) $(MFLAGS) ) + -( cd doc && $(MAKE) ) examples: force -test -d examples || mkdir examples - -(cd examples && ${MAKE} ${MFLAGS} all ) + -(cd examples && ${MAKE} all ) force: @@ -268,32 +274,32 @@ installdirs: $(srcdir)/support/mkinstalldirs 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 ) + -( cd shlib; ${MAKE} DESTDIR=${DESTDIR} uninstall ) install-shared: installdirs install-headers shared install-doc install-pc - ( cd shlib ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install ) + ( cd shlib ; ${MAKE} DESTDIR=${DESTDIR} install ) uninstall-shared: maybe-uninstall-headers maybe-uninstall-pc - -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) + -( cd shlib; ${MAKE} DESTDIR=${DESTDIR} uninstall ) install-examples: installdirs install-headers - -( cd examples ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install ) + -( cd examples ; ${MAKE} DESTDIR=${DESTDIR} install ) uninstall-examples: maybe-uninstall-headers - -( cd examples; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) + -( cd examples; ${MAKE} 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; \ + ${MAKE} 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; \ + ${MAKE} infodir=$(infodir) DESTDIR=${DESTDIR} uninstall; \ fi ) TAGS: force @@ -302,22 +308,24 @@ TAGS: force tags: force -( cd $(srcdir) && $(CTAGS) $(CSOURCES) $(HSOURCES) ) -clean: force +.PHONY: clean maintainer-clean distclean mostlyclean + +mostlyclean: force $(RM) $(OBJECTS) $(STATIC_LIBS) $(RM) readline readline.exe - ( cd shlib && $(MAKE) $(MFLAGS) $@ ) - -( cd doc && $(MAKE) $(MFLAGS) $@ ) - -( cd examples && $(MAKE) $(MFLAGS) $@ ) + ( cd shlib && $(MAKE) $@ ) + -( cd doc && $(MAKE) $@ ) + -( cd examples && $(MAKE) $@ ) -mostlyclean: clean - ( cd shlib && $(MAKE) $(MFLAGS) $@ ) - -( cd doc && $(MAKE) $(MFLAGS) $@ ) - -( cd examples && $(MAKE) $(MFLAGS) $@ ) +clean: mostlyclean + ( cd shlib && $(MAKE) $@ ) + -( cd doc && $(MAKE) $@ ) + -( cd examples && $(MAKE) $@ ) distclean maintainer-clean: clean - ( cd shlib && $(MAKE) $(MFLAGS) $@ ) - -( cd doc && $(MAKE) $(MFLAGS) $@ ) - -( cd examples && $(MAKE) $(MFLAGS) $@ ) + ( cd shlib && $(MAKE) $@ ) + -( cd doc && $(MAKE) $@ ) + -( cd examples && $(MAKE) $@ ) $(RM) Makefile $(RM) $(CREATED_CONFIGURE) $(RM) $(CREATED_TAGS) @@ -329,7 +337,7 @@ history.pc: config.status $(srcdir)/history.pc.in $(SHELL) config.status info dvi html pdf ps: - -( cd doc && $(MAKE) $(MFLAGS) $@ ) + -( cd doc && $(MAKE) $@ ) install-info: install-dvi: @@ -454,6 +462,9 @@ xfree.o: ansi_stdlib.h xmalloc.o: ${BUILD_DIR}/config.h xmalloc.o: ansi_stdlib.h +gettimeofday.o: ${BUILD_DIR}/config.h +gettimeofday.o: posixtime.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 diff --git a/NEWS b/NEWS index 1d88606..1fc6989 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,54 @@ +This is a terse description of the new features added to readline-8.3 since +the release of readline-8.2. + +New Features in Readline + +a. Output a newline if there is no prompt and readline reads an empty line. + +b. The history library falls back to stdio when writing the history list if + mmap fails. + +c. New bindable variable `search-ignore-case', causes readline to perform + case-insensitive incremental and non-incremental history searches. + +d. rl_full_quoting_desired: new application-settable variable, causes all + completions to be quoted as if they were filenames. + +e. rl_macro_display_hook: new application-settable function pointer, used if + the application wants to print macro values itself instead of letting + readline do it + +f. rl_reparse_colors: new application-callable function, reparses $LS_COLORS + (presumably after the user changes it) + +g. rl_completion_rewrite_hook: new application-settable function pointer, + called to modify the word being completed before comparing it against + pathnames from the file system. + +h. execute-named-command: a new bindable command that reads the name of a + readline command from the standard input and executes it. Bound to M-x + in emacs mode by default. + +i. Incremental and non-incremental searches now allow ^V/^Q (or, in the former + case, anything bound to quoted-insert) to quote characters in the search + string. + +j. Documentation has been significantly updated. + +k. New `force-meta-prefix' bindable variable, which forces the use of ESC as + the meta prefix when using "\M-" in key bindings instead of overloading + convert-meta. + +l. The default value for `readline-colored-completion-prefix' no longer has a + leading `.'; the original report was based on a misunderstanding. + +m. There is a new bindable command, `export-completions', which writes the + possible completions for a word to the standard output in a defined format. + +n. Readline can reset its idea of the screen dimensions when executing after + a SIGCONT. + +------------------------------------------------------------------------------- This is a terse description of the new features added to readline-8.2 since the release of readline-8.1. diff --git a/README b/README index 83cdb23..75eaa2f 100644 --- a/README +++ b/README @@ -1,7 +1,7 @@ Introduction ============ -This is the Gnu Readline library, version 8.2. +This is the Gnu Readline library, version 8.3. 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 @@ -33,7 +33,8 @@ 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. +to customize and control the build process, including how to build readline +in a directory other than the source directory. The file rlconf.h contains C preprocessor defines that enable and disable certain Readline features. @@ -47,7 +48,7 @@ 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'. +scripts in place of `read' (but look at bash's `read -e' first). Shared Libraries ================ diff --git a/aclocal.m4 b/aclocal.m4 index cc97bd4..ae2d8ae 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -3,7 +3,7 @@ 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 Copyright (C) 1987-2025 Free Software Foundation, Inc. dnl dnl @@ -69,11 +69,7 @@ AC_DEFUN(BASH_DECL_PRINTF, 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() @@ -238,6 +234,9 @@ AC_CACHE_VAL(bash_cv_dup2_broken, #include #include #include +#ifdef HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ int main() { @@ -432,6 +431,7 @@ AC_CACHE_VAL(bash_cv_sizeof_rlim_cur, #endif #include #include +int main() { struct rlimit r; @@ -457,6 +457,7 @@ AC_CACHE_VAL(bash_cv_sizeof_quad_t, #include #endif +int main() { #if HAVE_QUAD_T @@ -558,18 +559,8 @@ AC_CACHE_VAL(bash_cv_getenv_redef, # 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 */ +getenv (const char *name) { return "42"; } @@ -599,7 +590,6 @@ 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 @@ -608,16 +598,7 @@ AC_CACHE_CHECK([for standard-conformant putenv declaration], bash_cv_std_putenv, #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] )]) @@ -629,7 +610,6 @@ 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 @@ -638,16 +618,7 @@ AC_CACHE_CHECK([for standard-conformant unsetenv declaration], bash_cv_std_unset #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] )]) @@ -841,9 +812,7 @@ AC_CACHE_VAL(bash_cv_func_strcoll_broken, #include int -main(c, v) -int c; -char *v[]; +main(int c, char **v) { int r1, r2; char *deflocale, *defcoll; @@ -966,8 +935,8 @@ AC_CACHE_VAL(bash_cv_termcap_lib, [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, + [AC_CHECK_LIB(ncursesw, tgetent, bash_cv_termcap_lib=libncursesw, + [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses, bash_cv_termcap_lib=gnutermcap)])])])])])]) if test "X$_bash_needmsg" = "Xyes"; then AC_MSG_CHECKING(which library has the termcap functions) @@ -983,9 +952,15 @@ TERMCAP_DEP= elif test $bash_cv_termcap_lib = libtinfo; then TERMCAP_LIB=-ltinfo TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libncursesw; then +TERMCAP_LIB=-lncursesw +TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncurses; then TERMCAP_LIB=-lncurses TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libcurses; then +TERMCAP_LIB=-lcurses +TERMCAP_DEP= elif test $bash_cv_termcap_lib = libc; then TERMCAP_LIB= TERMCAP_DEP= @@ -1050,7 +1025,7 @@ 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, +AC_CHECK_MEMBERS(struct dirent.$1, [], [], [[ #include #include @@ -1074,35 +1049,9 @@ AC_CHECK_MEMBERS(struct dirent.$1, bash_cv_dirent_has_$1=yes, bash_cv_dirent_has ]]) ]) -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_DIRENT_D_INO], [BASH_STRUCT_DIRENT([d_ino])]) +AC_DEFUN([BASH_STRUCT_DIRENT_D_FILENO], [BASH_STRUCT_DIRENT([d_fileno])]) +AC_DEFUN([BASH_STRUCT_DIRENT_D_NAMLEN], [BASH_STRUCT_DIRENT([d_namlen])]) AC_DEFUN(BASH_STRUCT_TIMEVAL, [AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h) @@ -1345,15 +1294,13 @@ AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers, #endif #include -typedef void sigfunc(); +typedef void sigfunc(int); volatile int nsigint; #ifdef HAVE_POSIX_SIGNALS sigfunc * -set_signal_handler(sig, handler) - int sig; - sigfunc *handler; +set_signal_handler(int sig, sigfunc *handler) { struct sigaction act, oact; act.sa_handler = handler; @@ -1368,8 +1315,7 @@ set_signal_handler(sig, handler) #endif void -sigint(s) -int s; +sigint(int s) { nsigint++; } @@ -1607,13 +1553,15 @@ 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 +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 int -main(c, v) -int c; -char **v; +main(int c, char **v) { int w; setlocale(LC_ALL, "en_US.UTF-8"); w = wcwidth (0x0301); + if (w != 0) + exit (0); + w = wcwidth (0x200b); exit (w == 0); /* exit 0 if wcwidth broken */ } ]])], [bash_cv_wcwidth_broken=yes], [bash_cv_wcwidth_broken=no], @@ -2093,31 +2047,17 @@ AC_DEFUN([BASH_FUNC_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; @@ -2154,9 +2094,7 @@ AC_CACHE_VAL(bash_cv_wexitstatus_offset, #include int -main(c, v) - int c; - char **v; +main(int c, char **v) { pid_t pid, p; int s, i, n; @@ -2230,6 +2168,43 @@ main(int c, char **v) fi ]) +AC_DEFUN([BASH_FUNC_BRK], +[ + AC_MSG_CHECKING([for brk]) + AC_CACHE_VAL(ac_cv_func_brk, + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[ void *x = brk (0); ]])], + [ac_cv_func_brk=yes],[ac_cv_func_brk=no])]) + AC_MSG_RESULT($ac_cv_func_brk) + if test X$ac_cv_func_brk = Xyes; then + AC_CACHE_CHECK([for working brk], [bash_cv_func_brk], + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include + +int +main(int c, char **v) +{ + void *x; + + x = brk (0); + exit ((x == (void *)-1) ? 1 : 0); +} +]])],[bash_cv_func_brk=yes],[bash_cv_func_brk=no],[AC_MSG_WARN([cannot check working brk if cross-compiling]) + bash_cv_func_brk=yes +])]) + if test $bash_cv_func_brk = no; then + ac_cv_func_brk=no + fi + fi + if test $ac_cv_func_brk = yes; then + AC_DEFINE(HAVE_BRK, 1, + [Define if you have a working brk 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, @@ -2265,3 +2240,68 @@ else fi AC_DEFINE_UNQUOTED([FNMATCH_EQUIV_FALLBACK], [$bash_cv_fnmatch_equiv_value], [Whether fnmatch can be used for bracket equivalence classes]) ]) + +AC_DEFUN([BASH_FUNC_STRCHRNUL], +[ + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + AC_CACHE_CHECK([whether strchrnul works], + [bash_cv_func_strchrnul_works], + [AC_RUN_IFELSE([AC_LANG_PROGRAM( +[[ +#include +]], +[[const char *buf = "abc"; + return strchrnul (buf, 'd') != buf + 3; +]] +)], +[bash_cv_func_strchrnul_works=yes], [bash_cv_func_strchrnul_works=no], +[bash_cv_func_strchrnul_works=no] +)]) + +if test "$bash_cv_func_strchrnul_works" = "no"; then +AC_LIBOBJ([strchrnul]) +fi +]) + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +#if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +#fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) diff --git a/ansi_stdlib.h b/ansi_stdlib.h index 7dc2ee0..3cb3e07 100644 --- a/ansi_stdlib.h +++ b/ansi_stdlib.h @@ -2,7 +2,7 @@ /* A minimal stdlib.h containing extern declarations for those functions that bash uses. */ -/* Copyright (C) 1993 Free Software Foundation, Inc. +/* Copyright (C) 1993,2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -32,13 +32,7 @@ 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 (); diff --git a/bind.c b/bind.c index 880db8c..6aaa637 100644 --- a/bind.c +++ b/bind.c @@ -1,6 +1,6 @@ /* bind.c -- key binding and startup file support for the readline library. */ -/* Copyright (C) 1987-2022 Free Software Foundation, Inc. +/* Copyright (C) 1987-2024 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. @@ -65,20 +65,15 @@ extern int errno; #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; +/* Functions exported by this file. */ +rl_macro_print_func_t *rl_macro_display_hook = (rl_macro_print_func_t *)NULL; + 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 *); @@ -103,6 +98,15 @@ static int currently_reading_init_file; /* used only in this file */ static int _rl_prefer_visible_bell = 1; +/* Currently confined to this file for key bindings. If enabled (> 0), we + force meta key bindings to use the meta prefix (ESC). If unset (-1) or + disabled (0), we use the current value of _rl_convert_meta_chars_to_ascii + as in previous readline versions. */ +static int _rl_force_meta_prefix = 0; + +/* Do we want to force binding "\M-C" to the meta prefix (ESC-C)? */ +#define FORCE_META_PREFIX() (_rl_force_meta_prefix > 0 ? 1 : _rl_convert_meta_chars_to_ascii) + #define OP_EQ 1 #define OP_NE 2 #define OP_GT 3 @@ -142,7 +146,7 @@ rl_bind_key (int key, rl_command_func_t *function) 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 (META_CHAR (key) && FORCE_META_PREFIX()) { if (_rl_keymap[ESC].type == ISKMAP) { @@ -262,7 +266,7 @@ rl_unbind_function_in_map (rl_command_func_t *func, Keymap map) map[i].function = (rl_command_func_t *)NULL; rval = 1; } - else if (map[i].type == ISKMAP) /* TAG:readline-8.1 */ + else if (map[i].type == ISKMAP) { int r; r = rl_unbind_function_in_map (func, FUNCTION_TO_KEYMAP (map, i)); @@ -423,19 +427,8 @@ rl_generic_bind (int type, const char *keyseq, char *data, Keymap map) 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 + /* We rely on rl_translate_keyseq to do convert meta-chars to key + sequences with the meta prefix (ESC). */ if ((i + 1) < keys_len) { @@ -531,8 +524,7 @@ rl_translate_keyseq (const char *seq, char *array, int *len) /* 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'. - */ + 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 @@ -623,21 +615,28 @@ rl_translate_keyseq (const char *seq, char *array, int *len) c = (c == '?') ? RUBOUT : CTRL (_rl_to_upper (c)); has_control = 0; } + if (has_meta) - { - c = META (c); - has_meta = 0; - } + c = META (c); - /* If convert-meta is turned on, convert a meta char to a key sequence */ - if (META_CHAR (c) && _rl_convert_meta_chars_to_ascii) + /* If force-meta-prefix is turned on, convert a meta char to a key + sequence, but only if it uses the \M- syntax. */ + if (META_CHAR (c) && has_meta && FORCE_META_PREFIX()) { - array[l++] = ESC; /* ESC is meta-prefix */ - array[l++] = UNMETA (c); + int x = UNMETA (c); + if (x) + { + array[l++] = ESC; /* ESC is meta-prefix */ + array[l++] = x; + } + else + array[l++] = c; /* just do the best we can without sticking a NUL in there. */ } else array[l++] = (c); + has_meta = 0; + /* Null characters may be processed for incomplete prefixes at the end of sequence */ if (seq[i] == '\0') @@ -685,7 +684,8 @@ char * rl_untranslate_keyseq (int seq) { static char kseq[16]; - int i, c; + int i; + unsigned char c; i = 0; c = seq; @@ -696,35 +696,22 @@ rl_untranslate_keyseq (int seq) kseq[i++] = '-'; c = UNMETA (c); } - else if (c == ESC) + + if (c == ESC) /* look at _rl_force_meta_prefix here? */ { kseq[i++] = '\\'; c = 'e'; } - else if (CTRL_CHAR (c)) + else if (CTRL_CHAR (c) || c == RUBOUT) { 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 = '?'; + c = (c == RUBOUT) ? '?' : _rl_to_lower (UNCTRL (c)); } - if (c == ESC) - { - kseq[i++] = '\\'; - c = 'e'; - } - else if (c == '\\' || c == '"') - { - kseq[i++] = '\\'; - } + if (c == '\\' || c == '"') + kseq[i++] = '\\'; kseq[i++] = (unsigned char) c; kseq[i] = '\0'; @@ -735,9 +722,9 @@ char * _rl_untranslate_macro_value (char *seq, int use_escapes) { char *ret, *r, *s; - int c; + unsigned char c; - r = ret = (char *)xmalloc (7 * strlen (seq) + 1); + r = ret = (char *)xmalloc (8 * strlen (seq) + 1); for (s = seq; *s; s++) { c = *s; @@ -748,7 +735,9 @@ _rl_untranslate_macro_value (char *seq, int use_escapes) *r++ = '-'; c = UNMETA (c); } - else if (c == ESC) + + /* We want to keep from printing literal control chars */ + if (c == ESC) { *r++ = '\\'; c = 'e'; @@ -773,15 +762,10 @@ _rl_untranslate_macro_value (char *seq, int use_escapes) c = '?'; } - if (c == ESC) - { - *r++ = '\\'; - c = 'e'; - } - else if (c == '\\' || c == '"') + if (c == '\\' || c == '"') *r++ = '\\'; - *r++ = (unsigned char)c; + *r++ = c; } *r = '\0'; return ret; @@ -820,7 +804,7 @@ _rl_function_of_keyseq_internal (const char *keyseq, size_t len, Keymap map, int { unsigned char ic = keyseq[i]; - if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) + if (META_CHAR (ic) && FORCE_META_PREFIX()) /* XXX - might not want this */ { if (map[ESC].type == ISKMAP) { @@ -889,21 +873,30 @@ int rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map) { register int i, j, parsing_digits; - unsigned char ic; + unsigned int ic; /* int to handle ANYOTHERKEY */ 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. */ + /* Make sure to add the digits following the initial one (e.g., the binding + to digit-argument) and the optional `-' in a binding to digit-argument + or universal-argument to rl_executing_keyseq. This is basically + everything read by rl_digit_loop. */ for (i = j = parsing_digits = 0; keyseq && i < len; i++) { ic = keyseq[i]; + if (parsing_digits == 2) + { + if (ic == '-') /* skip over runs of minus chars */ + { + j = i + 1; + continue; + } + parsing_digits = 1; + } if (parsing_digits) { if (_rl_digit_p (ic)) @@ -916,10 +909,11 @@ rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map) if (map[ic].type == ISKMAP) { - if (i + 1 == len) - return -1; map = FUNCTION_TO_KEYMAP (map, ic); - continue; + if (i + 1 == len) + ic = ANYOTHERKEY; + else + continue; } if (map[ic].type == ISFUNC) { @@ -938,16 +932,11 @@ rl_trim_arg_from_keyseq (const char *keyseq, size_t len, Keymap map) /* 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; - } + but set parsing_digits to 2 to note that we saw `-'. See above + for the check that skips over one or more `-' characters. */ + if (map[ic].function == rl_universal_argument || + (map[ic].function == rl_digit_argument && ic == '-')) + parsing_digits = 2; map = map0; j = i + 1; @@ -1141,25 +1130,11 @@ _rl_read_init_file (const char *filename, int include_level) } 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, @@ -1257,7 +1232,7 @@ 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; +static size_t if_stack_size; /* Push _rl_parsing_conditionalized_out, and set parser state based on ARGS. */ @@ -1682,7 +1657,6 @@ rl_parse_and_bind (char *string) if (_rl_stricmp (string, "set") == 0) { char *var, *value, *e; - int s; var = string + i; /* Make VAR point to start of variable name. */ @@ -1860,7 +1834,7 @@ rl_parse_and_bind (char *string) if (*funname == '\'' || *funname == '"') { char useq[2]; - int fl = strlen (funname); + size_t fl = strlen (funname); useq[0] = key; useq[1] = '\0'; if (fl && funname[fl - 1] == *funname) @@ -1890,6 +1864,7 @@ rl_parse_and_bind (char *string) false. */ #define V_SPECIAL 0x1 +#define V_DEPRECATED 0x02 static const struct { const char * const name; @@ -1913,6 +1888,7 @@ static const struct { { "enable-keypad", &_rl_enable_keypad, 0 }, { "enable-meta-key", &_rl_enable_meta, 0 }, { "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, + { "force-meta-prefix", &_rl_force_meta_prefix, 0 }, { "history-preserve-point", &_rl_history_preserve_point, 0 }, { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 }, { "input-meta", &_rl_meta_flag, 0 }, @@ -1927,6 +1903,7 @@ static const struct { { "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 }, + { "search-ignore-case", &_rl_search_case_fold, 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 }, @@ -2605,17 +2582,13 @@ _rl_get_keyname (int key) char *keyname; int i, c; - keyname = (char *)xmalloc (8); + keyname = (char *)xmalloc (9); 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) @@ -2625,28 +2598,23 @@ _rl_get_keyname (int key) keyname[2] = '\0'; return keyname; } -#endif - /* RUBOUT is translated directly into \C-? */ - if (key == RUBOUT) + if (key == ANYOTHERKEY) { - keyname[0] = '\\'; - keyname[1] = 'C'; - keyname[2] = '-'; - keyname[3] = '?'; - keyname[4] = '\0'; + keyname[0] = '\0'; return keyname; } i = 0; + /* Now add special prefixes needed for control characters. This can potentially change C. */ - if (CTRL_CHAR (c)) + if (CTRL_CHAR (c) || c == RUBOUT) { keyname[i++] = '\\'; keyname[i++] = 'C'; keyname[i++] = '-'; - c = _rl_to_lower (UNCTRL (c)); + c = (c == RUBOUT) ? '?' : _rl_to_lower (UNCTRL (c)); } /* XXX experimental code. Turn the characters that are not ASCII or @@ -2688,7 +2656,7 @@ rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) { register int key; char **result; - int result_index, result_size; + size_t result_index, result_size; result = (char **)NULL; result_index = result_size = 0; @@ -2724,53 +2692,24 @@ rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) { char **seqs; register int i; + char *keyname; + size_t knlen; /* 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 + if (map[key].function == 0) break; + seqs = rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key)); if (seqs == 0) break; + keyname = _rl_get_keyname (key); + knlen = RL_STRLEN (keyname); + 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]); + char *x; if (result_index + 2 > result_size) { @@ -2778,10 +2717,16 @@ rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) result = (char **)xrealloc (result, result_size * sizeof (char *)); } - result[result_index++] = keyname; + x = xmalloc (knlen + RL_STRLEN (seqs[i]) + 1); + strcpy (x, keyname); + strcpy (x + knlen, seqs[i]); + xfree (seqs[i]); + + result[result_index++] = x; result[result_index] = (char *)NULL; } + xfree (keyname); xfree (seqs); } break; @@ -2798,73 +2743,72 @@ 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) +rl_print_keybinding (const char *name, Keymap kmap, int print_readably) { - register int i; - const char **names; - const char *name; + rl_command_func_t *function; + char **invokers; - names = rl_funmap_names (); - - fprintf (rl_outstream, "\n"); + function = rl_named_function (name); + invokers = function ? rl_invoking_keyseqs_in_map (function, kmap ? kmap : _rl_keymap) : (char **)NULL; - for (i = 0; name = names[i]; i++) + if (print_readably) { - 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 { - if (!invokers) - fprintf (rl_outstream, "# %s (not bound)\n", name); - else - { - register int j; + register int j; - for (j = 0; invokers[j]; j++) - { - fprintf (rl_outstream, "\"%s\": %s\n", - invokers[j], name); - xfree (invokers[j]); - } - - xfree (invokers); + 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 { - if (!invokers) - fprintf (rl_outstream, "%s is not bound to any keys\n", - name); - else - { - register int j; + register int j; - fprintf (rl_outstream, "%s can be found on ", name); + 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"); - } + 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"); + if (j == 5 && invokers[j]) + fprintf (rl_outstream, "...\n"); - for (j = 0; invokers[j]; j++) - xfree (invokers[j]); + for (j = 0; invokers[j]; j++) + xfree (invokers[j]); - xfree (invokers); - } + xfree (invokers); } } +} + +/* 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_print_keybinding (name, _rl_keymap, print_readably); xfree (names); } @@ -2885,9 +2829,9 @@ rl_dump_functions (int count, int key) static void _rl_macro_dumper_internal (int print_readably, Keymap map, char *prefix) { - register int key; + int key; char *keyname, *out; - int prefix_len; + size_t prefix_len; for (key = 0; key < KEYMAP_SIZE; key++) { @@ -2897,6 +2841,16 @@ _rl_macro_dumper_internal (int print_readably, Keymap map, char *prefix) keyname = _rl_get_keyname (key); out = _rl_untranslate_macro_value ((char *)map[key].function, 0); + /* If the application wants to print macros, let it. Give it the + ascii-fied value with backslash escapes, so it will have to use + rl_macro_bind (with its call to rl_translate_keyseq) to get the + same value back. */ + if (rl_macro_display_hook) + { + (*rl_macro_display_hook) (keyname, out, print_readably, prefix); + break; + } + if (print_readably) fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "", keyname, @@ -2960,10 +2914,40 @@ rl_dump_macros (int count, int key) static char * _rl_get_string_variable_value (const char *name) { - static char numbuf[32]; + static char numbuf[64]; /* more than enough for INTMAX_MAX */ char *ret; - if (_rl_stricmp (name, "bell-style") == 0) + if (_rl_stricmp (name, "active-region-start-color") == 0) + { + if (_rl_active_region_start_color == 0) + return 0; + ret = _rl_untranslate_macro_value (_rl_active_region_start_color, 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, "active-region-end-color") == 0) + { + if (_rl_active_region_end_color == 0) + return 0; + ret = _rl_untranslate_macro_value (_rl_active_region_end_color, 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, "bell-style") == 0) { switch (_rl_bell_preference) { @@ -2980,24 +2964,40 @@ _rl_get_string_variable_value (const char *name) return (_rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT); else if (_rl_stricmp (name, "completion-display-width") == 0) { +#if defined (HAVE_VSNPRINTF) + snprintf (numbuf, sizeof (numbuf), "%d", _rl_completion_columns); +#else sprintf (numbuf, "%d", _rl_completion_columns); +#endif return (numbuf); } else if (_rl_stricmp (name, "completion-prefix-display-length") == 0) { +#if defined (HAVE_VSNPRINTF) + snprintf (numbuf, sizeof (numbuf), "%d", _rl_completion_prefix_display_length); +#else sprintf (numbuf, "%d", _rl_completion_prefix_display_length); +#endif return (numbuf); } else if (_rl_stricmp (name, "completion-query-items") == 0) { +#if defined (HAVE_VSNPRINTF) + snprintf (numbuf, sizeof (numbuf), "%d", rl_completion_query_items); +#else sprintf (numbuf, "%d", rl_completion_query_items); +#endif 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); +#if defined (HAVE_VSNPRINTF) + snprintf (numbuf, sizeof (numbuf), "%d", history_is_stifled() ? history_max_entries : -1); +#else + sprintf (numbuf, "%d", history_is_stifled() ? history_max_entries : -1); +#endif return (numbuf); } else if (_rl_stricmp (name, "isearch-terminators") == 0) @@ -3024,7 +3024,11 @@ _rl_get_string_variable_value (const char *name) } else if (_rl_stricmp (name, "keyseq-timeout") == 0) { - sprintf (numbuf, "%d", _rl_keyseq_timeout); +#if defined (HAVE_VSNPRINTF) + snprintf (numbuf, sizeof (numbuf), "%d", _rl_keyseq_timeout); +#else + sprintf (numbuf, "%d", _rl_keyseq_timeout); +#endif return (numbuf); } else if (_rl_stricmp (name, "emacs-mode-string") == 0) diff --git a/callback.c b/callback.c index 7209ec3..180b683 100644 --- a/callback.c +++ b/callback.c @@ -1,6 +1,6 @@ /* callback.c -- functions to use readline as an X `callback' mechanism. */ -/* Copyright (C) 1987-2022 Free Software Foundation, Inc. +/* Copyright (C) 1987-2024 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. @@ -116,8 +116,8 @@ rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *linefunc) do { \ if (rl_persistent_signal_handlers == 0) \ { \ - rl_clear_signals (); \ - if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \ + rl_clear_signals (); \ + if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \ } \ return; \ } while (0) @@ -323,6 +323,15 @@ rl_callback_handler_remove (void) rl_linefunc = NULL; RL_UNSETSTATE (RL_STATE_CALLBACK); RL_CHECK_SIGNALS (); + + /* Do what we need to do to manage the undo list if we haven't already done + it in rl_callback_read_char(). If there's no undo list, we don't need to + do anything. It doesn't matter if we try to revert all previous lines a + second time; none of the history entries will have an undo list. */ + if (rl_undo_list) + readline_common_teardown (); + /* At this point, rl_undo_list == NULL. */ + if (in_handler) { in_handler = 0; @@ -363,7 +372,7 @@ rl_callback_sigcleanup (void) 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); + _rl_nsearch_sigcleanup (_rl_nscxt, 0); else if (RL_ISSTATE (RL_STATE_VIMOTION)) RL_UNSETSTATE (RL_STATE_VIMOTION); else if (RL_ISSTATE (RL_STATE_NUMERICARG)) @@ -373,6 +382,9 @@ rl_callback_sigcleanup (void) } else if (RL_ISSTATE (RL_STATE_MULTIKEY)) RL_UNSETSTATE (RL_STATE_MULTIKEY); + else if (RL_ISSTATE (RL_STATE_READSTR)) + _rl_readstr_sigcleanup (_rl_rscxt, 0); + if (RL_ISSTATE (RL_STATE_CHARSEARCH)) RL_UNSETSTATE (RL_STATE_CHARSEARCH); diff --git a/chardefs.h b/chardefs.h index 24a25f1..02f7e17 100644 --- a/chardefs.h +++ b/chardefs.h @@ -55,7 +55,7 @@ #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 META_CHAR(c) ((unsigned char)(c) > meta_character_threshold && (unsigned char)(c) <= largest_char) #define CTRL(c) ((c) & control_character_mask) #define META(c) ((c) | meta_character_bit) diff --git a/colors.c b/colors.c index 4212c64..329acce 100644 --- a/colors.c +++ b/colors.c @@ -2,7 +2,7 @@ Modified by Chet Ramey for Readline. - Copyright (C) 1985, 1988, 1990-1991, 1995-2021 + Copyright (C) 1985, 1988, 1990-1991, 1995-2021, 2023 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -73,7 +73,7 @@ static bool is_colored (enum indicator_no type); static void restore_default_color (void); -#define RL_COLOR_PREFIX_EXTENSION ".readline-colored-completion-prefix" +#define RL_COLOR_PREFIX_EXTENSION "readline-colored-completion-prefix" COLOR_EXT_TYPE *_rl_color_ext_list = 0; diff --git a/complete.c b/complete.c index 70a0a60..9abdede 100644 --- a/complete.c +++ b/complete.c @@ -1,6 +1,6 @@ /* complete.c -- filename completion for readline. */ -/* Copyright (C) 1987-2021 Free Software Foundation, Inc. +/* Copyright (C) 1987-2025 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. @@ -77,12 +77,12 @@ extern int errno; # include "colors.h" #endif -#ifdef __STDC__ -typedef int QSFUNC (const void *, const void *); -#else -typedef int QSFUNC (); +#ifndef MIN +#define MIN(x,y) (((x) < (y)) ? (x): (y)) #endif +typedef int QSFUNC (const void *, const void *); + #ifdef HAVE_LSTAT # define LSTAT lstat #else @@ -153,6 +153,8 @@ static int complete_get_screenwidth (void); static char *make_quoted_replacement (char *, int, char *); +static void _rl_export_completions (char **, char *, int, int); + /* **************************************************************** */ /* */ /* Completion matching, from readline's point of view. */ @@ -250,11 +252,24 @@ rl_icppfunc_t *rl_filename_stat_hook = (rl_icppfunc_t *)NULL; 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. */ + keyboard (after its potential modification by rl_completion_rewrite_hook). + 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; +/* If non-zero, this is the address of a function to call before + comparing the filename portion of a word to be completed with directory + entries from the filesystem. This takes the address of the partial word + to be completed, after any rl_filename_dequoting_function has been applied. + The function should either return its first argument (if no conversion + takes place) or newly-allocated memory. This can, for instance, convert + the filename portion of the completion word to a character set suitable + for comparison against directory entries read from the filesystem (after + their potential modification by rl_filename_rewrite_hook). + 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_completion_rewrite_hook = (rl_dequote_func_t *)NULL; + /* Non-zero means readline completion functions perform tilde expansion. */ int rl_complete_with_tilde_expansion = 0; @@ -340,6 +355,15 @@ int rl_filename_completion_desired = 0; entry finder function. */ int rl_filename_quoting_desired = 1; +/* Non-zero means we should apply filename-type quoting to all completions + even if we are not otherwise treating the matches as filenames. This is + ALWAYS zero on entry, and can only be changed within a completion entry + finder function. */ +int rl_full_quoting_desired = 0; + +#define QUOTING_DESIRED() \ + (rl_full_quoting_desired || (rl_filename_completion_desired && rl_filename_quoting_desired)) + /* 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. @@ -455,6 +479,7 @@ rl_complete (int ignore, int invoking_key) int rl_possible_completions (int ignore, int invoking_key) { + last_completion_failed = 0; rl_completion_invoking_key = invoking_key; return (rl_complete_internal ('?')); } @@ -484,12 +509,50 @@ rl_completion_mode (rl_command_func_t *cfunc) return TAB; } +/********************************************/ +/* */ +/* Completion signal handling and cleanup */ +/* */ +/********************************************/ + +/* State to clean up and free if completion is interrupted by a signal. */ +typedef struct { + char **matches; + char *saved_line; +} complete_sigcleanarg_t; + +static void +_rl_complete_sigcleanup (int sig, void *ptr) +{ + complete_sigcleanarg_t *arg; + + if (sig == SIGINT) /* XXX - for now */ + { + arg = ptr; + _rl_free_match_list (arg->matches); + FREE (arg->saved_line); + _rl_complete_display_matches_interrupt = 1; + } +} + /************************************/ /* */ /* Completion utility functions */ /* */ /************************************/ +static inline size_t +vector_len (char **vector) +{ + size_t ret; + + if (vector == 0 || vector[0] == 0) + return (size_t)0; + for (ret = 0; vector[ret]; ret++) + ; + return ret; +} + /* Reset public readline state on a signal or other event. */ void _rl_reset_completion_state (void) @@ -498,16 +561,6 @@ _rl_reset_completion_state (void) 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 @@ -516,6 +569,7 @@ 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_full_quoting_desired = 0; rl_completion_type = what_to_do; rl_completion_suppress_append = rl_completion_suppress_quote = 0; rl_completion_append_character = ' '; @@ -827,7 +881,8 @@ fnprint (const char *to_print, int prefix_bytes, const char *real_pathname) 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) + if (_rl_completion_prefix_display_length > 0 && prefix_bytes >= print_len && + prefix_bytes > _rl_completion_prefix_display_length) prefix_bytes = 0; #if defined (COLOR_SUPPORT) @@ -846,13 +901,16 @@ fnprint (const char *to_print, int prefix_bytes, const char *real_pathname) printed_len = ELLIPSIS_LEN; } #if defined (COLOR_SUPPORT) - else if (prefix_bytes && _rl_colored_completion_prefix > 0) + else if (prefix_bytes && _rl_completion_prefix_display_length <= 0 && + _rl_colored_completion_prefix > 0) { common_prefix_len = prefix_bytes; prefix_bytes = 0; /* XXX - print color indicator start here */ colored_prefix_start (); } + else + common_prefix_len = prefix_bytes = 0; /* no ellipsis or color */ #endif s = to_print + prefix_bytes; @@ -1261,8 +1319,7 @@ remove_duplicate_matches (char **matches) char **temp_array; /* Sort the items. */ - for (i = 0; matches[i]; i++) - ; + i = vector_len (matches); /* Sort the array without matches[0], since we need it to stay in place no matter what. */ @@ -1319,8 +1376,9 @@ compute_lcd_of_matches (char **match_list, int matches, const char *text) int low; /* Count of max-matched characters. */ int lx; char *dtext; /* dequoted TEXT, if needed */ + size_t si1, si2; + size_t len1, len2; #if defined (HANDLE_MULTIBYTE) - int v; size_t v1, v2; mbstate_t ps1, ps2; WCHAR_T wc1, wc2; @@ -1345,7 +1403,10 @@ compute_lcd_of_matches (char **match_list, int matches, const char *text) memset (&ps2, 0, sizeof (mbstate_t)); } #endif - for (si = 0; (c1 = match_list[i][si]) && (c2 = match_list[i + 1][si]); si++) + len1 = strlen (match_list[i]); + len2 = strlen (match_list[i + 1]); + + for (si1 = si2 = 0; (c1 = match_list[i][si1]) && (c2 = match_list[i + 1][si2]); si1++,si2++) { if (_rl_completion_case_fold) { @@ -1355,8 +1416,8 @@ compute_lcd_of_matches (char **match_list, int matches, const char *text) #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); + v1 = MBRTOWC (&wc1, match_list[i]+si1, len1 - si1, &ps1); + v2 = MBRTOWC (&wc2, match_list[i+1]+si2, len2 - si2, &ps2); if (MB_INVALIDCH (v1) || MB_INVALIDCH (v2)) { if (c1 != c2) /* do byte comparison */ @@ -1370,8 +1431,11 @@ compute_lcd_of_matches (char **match_list, int matches, const char *text) } if (wc1 != wc2) break; - else if (v1 > 1) - si += v1 - 1; + + if (v1 > 1) + si1 += v1 - 1; + if (v2 > 1) + si2 += v2 - 1; } else #endif @@ -1379,6 +1443,7 @@ compute_lcd_of_matches (char **match_list, int matches, const char *text) break; } + si = MIN (si1, si2); /* use shorter of matches of different length */ if (low > si) low = si; } @@ -1412,10 +1477,8 @@ compute_lcd_of_matches (char **match_list, int matches, const char *text) 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) + if (QUOTING_DESIRED() && rl_completion_found_quote && + rl_filename_dequoting_function) { dtext = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); text = dtext; @@ -1543,7 +1606,7 @@ rl_display_match_list (char **matches, int len, int max) /* 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); + sind = temp ? RL_STRLEN (temp) : RL_STRLEN (t); if (common_length > max || sind > max) common_length = sind = 0; @@ -1630,7 +1693,7 @@ rl_display_match_list (char **matches, int len, int max) if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count) { lines = _rl_internal_pager (lines); - if (lines < 0) + if (lines < 0 || _rl_complete_display_matches_interrupt) return; } } @@ -1658,7 +1721,7 @@ rl_display_match_list (char **matches, int len, int max) if (_rl_page_completions && lines >= _rl_screenheight - 1) { lines = _rl_internal_pager (lines); - if (lines < 0) + if (lines < 0 || _rl_complete_display_matches_interrupt) return; } } @@ -1745,7 +1808,9 @@ display_matches (char **matches) } } - rl_display_match_list (matches, len, max); + /* We rely on the caller to set MATCHES to 0 when this returns. */ + if (_rl_complete_display_matches_interrupt == 0) + rl_display_match_list (matches, len, max); rl_forced_update_display (); rl_display_fixed = 1; @@ -1768,9 +1833,7 @@ make_quoted_replacement (char *match, int mtype, char *qc) matches don't require a quoted substring. */ replacement = match; - should_quote = match && rl_completer_quote_characters && - rl_filename_completion_desired && - rl_filename_quoting_desired; + should_quote = match && rl_completer_quote_characters && QUOTING_DESIRED(); if (should_quote) should_quote = should_quote && (!qc || !*qc || @@ -1784,6 +1847,11 @@ make_quoted_replacement (char *match, int mtype, char *qc) should_quote = rl_filename_quote_characters ? (_rl_strpbrk (match, rl_filename_quote_characters) != 0) : 0; + /* If we saw a quote in the original word, but readline thinks the + match doesn't need to be quoted, and the application has a filename + quoting function, give the application a chance to quote it if + needed so we don't second-guess the user. */ + should_quote |= *qc == 0 && rl_completion_found_quote && mtype != NO_MATCH && rl_filename_quoting_function; do_replace = should_quote ? mtype : NO_MATCH; /* Quote the replacement, since we found an embedded @@ -1791,6 +1859,7 @@ make_quoted_replacement (char *match, int mtype, char *qc) if (do_replace != NO_MATCH && rl_filename_quoting_function) replacement = (*rl_filename_quoting_function) (match, do_replace, qc); } + return (replacement); } @@ -1976,8 +2045,7 @@ 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) + if (QUOTING_DESIRED() && rl_completion_found_quote && rl_filename_dequoting_function) { temp = (*rl_filename_dequoting_function) (text, rl_completion_quote_character); r = strcmp (temp, match); @@ -1995,16 +2063,19 @@ compare_match (char *text, const char *match) `!' 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. */ + there is more than one and partial completion is not possible. + `$' implements a protocol for exporting completions and information about + what is being completed to another process via rl_outstream. */ 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; + int start, end, delimiter, found_quote, i, nontrivial_lcd, do_display; char *text, *saved_line_buffer; char quote_char; int tlen, mlen, saved_last_completion_failed; + complete_sigcleanarg_t cleanarg; /* state to clean up on signal */ RL_SETSTATE(RL_STATE_COMPLETING); @@ -2039,8 +2110,7 @@ rl_complete_internal (int what_to_do) strcmp directly. */ /* nontrivial_lcd is set if the common prefix adds something to the word being completed. */ - if (rl_filename_completion_desired && rl_filename_quoting_desired && - rl_completion_found_quote && rl_filename_dequoting_function) + if (QUOTING_DESIRED() && rl_completion_found_quote && rl_filename_dequoting_function) { char *t; t = (*rl_filename_dequoting_function) (text, rl_completion_quote_character); @@ -2052,9 +2122,11 @@ rl_complete_internal (int what_to_do) nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; if (what_to_do == '!' || what_to_do == '@') tlen = strlen (text); - xfree (text); - if (matches == 0) + if (what_to_do != '$') + xfree (text); + + if (matches == 0 && what_to_do != '$') /* we can export no completions */ { rl_ding (); FREE (saved_line_buffer); @@ -2070,7 +2142,7 @@ rl_complete_internal (int what_to_do) rl_filename_completion_function does this. */ i = rl_filename_completion_desired; - if (postprocess_matches (&matches, i) == 0) + if (postprocess_matches (&matches, i) == 0 && what_to_do != '$') /* we can export no completions */ { rl_ding (); FREE (saved_line_buffer); @@ -2084,6 +2156,8 @@ rl_complete_internal (int what_to_do) if (matches && matches[0] && *matches[0]) last_completion_failed = 0; + do_display = 0; + switch (what_to_do) { case TAB: @@ -2117,13 +2191,13 @@ rl_complete_internal (int what_to_do) { if (what_to_do == '!') { - display_matches (matches); + do_display = 1; break; } else if (what_to_do == '@') { if (nontrivial_lcd == 0) - display_matches (matches); + do_display = 1; break; } else if (rl_editing_mode != vi_mode) @@ -2147,23 +2221,16 @@ rl_complete_internal (int what_to_do) 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; + /*FALLTHROUGH*/ + + case '%': /* used by menu_complete */ + case '|': /* add this for unconditional display */ + do_display = 1; + break; + + case '$': + _rl_export_completions (matches, text, start, end); + xfree (text); break; default: @@ -2176,6 +2243,34 @@ rl_complete_internal (int what_to_do) return 1; } + /* If we need to display the match list, set up to clean it up on receipt of + a signal and do it here. If the application has registered a function to + display the matches, let it do the work. */ + if (do_display) + { + if (rl_completion_display_matches_hook == 0) + { + _rl_sigcleanup = _rl_complete_sigcleanup; + cleanarg.matches = matches; + cleanarg.saved_line = saved_line_buffer; + _rl_sigcleanarg = &cleanarg; + _rl_complete_display_matches_interrupt = 0; + } + + display_matches (matches); + + if (_rl_complete_display_matches_interrupt) + { + matches = 0; /* Both already freed by _rl_complete_sigcleanup */ + saved_line_buffer = 0; + _rl_complete_display_matches_interrupt = 0; + if (rl_signal_event_hook) + (*rl_signal_event_hook) (); + } + _rl_sigcleanup = 0; + _rl_sigcleanarg = 0; + } + _rl_free_match_list (matches); /* Check to see if the line has changed through all of this manipulation. */ @@ -2216,7 +2311,7 @@ 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; + size_t match_list_size; /* The list of matches. */ char **match_list; @@ -2281,9 +2376,9 @@ rl_completion_matches (const char *text, rl_compentry_func_t *entry_function) char * rl_username_completion_function (const char *text, int state) { -#if defined (__WIN32__) || defined (__OPENNT) +#if defined (_WIN32) || defined (__OPENNT) || !defined (HAVE_GETPWENT) return (char *)NULL; -#else /* !__WIN32__ && !__OPENNT) */ +#else /* !_WIN32 && !__OPENNT) && HAVE_GETPWENT */ static char *username = (char *)NULL; static struct passwd *entry; static int namelen, first_char, first_char_loc; @@ -2298,25 +2393,19 @@ rl_username_completion_function (const char *text, int state) 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 @@ -2332,7 +2421,7 @@ rl_username_completion_function (const char *text, int state) return (value); } -#endif /* !__WIN32__ && !__OPENNT */ +#endif /* !_WIN32 && !__OPENNT && HAVE_GETPWENT */ } /* Return non-zero if CONVFN matches FILENAME up to the length of FILENAME @@ -2343,18 +2432,7 @@ rl_username_completion_function (const char *text, int state) 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 + size_t len; if (filename_len == 0) return 1; @@ -2362,100 +2440,26 @@ complete_fncmp (const char *convfn, int convlen, const char *filename, int filen 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) + if (_rl_completion_case_fold) { - /* Case-insensitive comparison treating _ and - as equivalent */ + /* Case-insensitive comparison treating _ and - as equivalent if + _rl_completion_case_map is non-zero */ #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; - } + return (_rl_mb_strcaseeqn (convfn, convlen, filename, filename_len, len, _rl_completion_case_map)); 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; + (convlen >= filename_len)) + return (_rl_strcaseeqn (convfn, filename, len, _rl_completion_case_map)); } else { + /* XXX - add new _rl_mb_streqn function (like mbsncmp) instead of + relying on byte equivalence? */ if ((convfn[0] == filename[0]) && (convlen >= filename_len) && (strncmp (filename, convfn, filename_len) == 0)) @@ -2477,7 +2481,8 @@ rl_filename_completion_function (const char *text, int state) static char *users_dirname = (char *)NULL; static int filename_len; char *temp, *dentry, *convfn; - int dirlen, dentlen, convlen; + size_t dirlen; + int dentlen, convlen; int tilde_dirname; struct dirent *entry; @@ -2586,6 +2591,18 @@ rl_filename_completion_function (const char *text, int state) } filename_len = strlen (filename); + /* Normalize the filename if the application has set a rewrite hook. */ + if (*filename && rl_completion_rewrite_hook) + { + temp = (*rl_completion_rewrite_hook) (filename, filename_len); + if (temp != filename) + { + xfree (filename); + filename = temp; + filename_len = strlen (filename); + } + } + rl_filename_completion_desired = 1; } @@ -2598,6 +2615,7 @@ rl_filename_completion_function (const char *text, int state) /* Now that we have some state, we can read the directory. */ entry = (struct dirent *)NULL; + convfn = dentry = 0; while (directory && (entry = readdir (directory))) { convfn = dentry = entry->d_name; @@ -2615,17 +2633,20 @@ rl_filename_completion_function (const char *text, int state) if (filename_len == 0) { if (_rl_match_hidden_files == 0 && HIDDEN_FILE (convfn)) - continue; + { + if (convfn != dentry) + xfree (convfn); + continue; + } if (convfn[0] != '.' || (convfn[1] && (convfn[1] != '.' || convfn[2]))) break; } - else - { - if (complete_fncmp (convfn, convlen, filename, filename_len)) - break; - } + else if (complete_fncmp (convfn, convlen, filename, filename_len)) + break; + else if (convfn != dentry) + xfree (convfn); } if (entry == 0) @@ -2777,8 +2798,8 @@ rl_old_menu_complete (int count, int invoking_key) RL_UNSETSTATE(RL_STATE_COMPLETING); - for (match_list_size = 0; matches[match_list_size]; match_list_size++) - ; + match_list_size = vector_len (matches); + /* matches[0] is lcd if match_list_size > 1, but the circular buffer code below should take care of it. */ @@ -2847,7 +2868,7 @@ rl_menu_complete (int count, int ignore) 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; + static int delimiter; /* The first time through, we generate the list of matches and set things up to insert them. */ @@ -2912,8 +2933,7 @@ rl_menu_complete (int count, int ignore) RL_UNSETSTATE(RL_STATE_COMPLETING); - for (match_list_size = 0; matches[match_list_size]; match_list_size++) - ; + match_list_size = vector_len (matches); if (match_list_size == 0) { @@ -2943,7 +2963,7 @@ rl_menu_complete (int count, int ignore) if (rl_completion_query_items > 0 && match_list_size >= rl_completion_query_items) { rl_ding (); - FREE (matches); + _rl_free_match_list (matches); matches = (char **)0; full_completion = 1; return (0); @@ -3012,3 +3032,58 @@ rl_backward_menu_complete (int count, int key) arguments for menu-complete, and vice versa. */ return (rl_menu_complete (-count, key)); } + +/* This implements a protocol to export completions to another process or + calling application via rl_outstream. + + MATCHES are the possible completions for TEXT, which is the text between + START and END in rl_line_buffer. + + We print: + N - the number of matches + T - the word being completed + S:E - the start and end offsets of T in rl_line_buffer + then each match, one per line + + If there are no matches, MATCHES is NULL, N will be 0, and there will be + no output after S:E. + + Since MATCHES[0] can be empty if there is no common prefix of the elements + of MATCHES, applications should be prepared to deal with an empty line + preceding the matches. +*/ + +static void +_rl_export_completions (char **matches, char *text, int start, int end) +{ + size_t len, i; + + len = vector_len (matches); + + if (RL_ISSTATE (RL_STATE_TERMPREPPED)) + fprintf (rl_outstream, "\r\n"); + fprintf (rl_outstream, "%zd\n", len); + fprintf (rl_outstream, "%s\n", text); + fprintf (rl_outstream, "%d:%d\n", start, end); /* : because it's not a radix character */ + for (i = 0; i < len; i++) + { + print_filename (matches[i], matches[i], 0); + fprintf (rl_outstream, "\n"); + } + fflush (rl_outstream); +} + +int +rl_export_completions (int count, int key) +{ + rl_complete_internal ('$'); + + /* Clear the line buffer, currently requires a count argument. */ + if (count > 1) + { + rl_delete_text (0, rl_end); /* undoable */ + rl_point = rl_mark = 0; + } + + return 0; +} diff --git a/config.h.in b/config.h.in index 521e778..71b051e 100644 --- a/config.h.in +++ b/config.h.in @@ -1,3 +1,21 @@ +/* config.h.in for the GNU readline library. */ + +/* Copyright (C) 1994-2024 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 . +*/ + /* config.h.in. Maintained by hand. */ /* Template definitions for autoconf */ @@ -27,6 +45,8 @@ #undef ssize_t +#undef mode_t + #undef const #undef volatile @@ -87,6 +107,15 @@ /* Define if you have the mbrtowc function. */ #undef HAVE_MBRTOWC +/* Define if you have the mbscasecmp function. */ +#undef HAVE_MBSCASECMP + +/* Define if you have the mbscmp function. */ +#undef HAVE_MBSCMP + +/* Define if you have the mbsncmp function. */ +#undef HAVE_MBSNCMP + /* Define if you have the mbsrtowcs function. */ #undef HAVE_MBSRTOWCS @@ -131,6 +160,12 @@ /* Define if you have the tcgetattr function. */ #undef HAVE_TCGETATTR +/* Define if you have the tcgetwinsize function. */ +#undef HAVE_TCGETWINSIZE + +/* Define if you have the tcsetwinsize function. */ +#undef HAVE_TCSETWINSIZE + /* Define if you have the towlower function. */ #undef HAVE_TOWLOWER @@ -146,6 +181,12 @@ /* Define if you have the wcscoll function. */ #undef HAVE_WCSCOLL +#undef HAVE_WCSLEN +#undef HAVE_WCSNLEN + +/* Define if you have the wcsnrtombs function. */ +#undef HAVE_WCSNRTOMBS + /* Define if you have the wctype function. */ #undef HAVE_WCTYPE diff --git a/configure b/configure index cb4e07a..e74c229 100755 --- a/configure +++ b/configure @@ -1,12 +1,12 @@ #! /bin/sh -# From configure.ac for Readline 8.2, version 2.97. +# From configure.ac for Readline 8.3, version 2.103. # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for readline 8.2. +# Generated by GNU Autoconf 2.72 for readline 8.3. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # @@ -18,7 +18,6 @@ # 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 @@ -27,12 +26,13 @@ then : # 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 #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -104,7 +104,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# 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 @@ -134,15 +134,14 @@ case $- in # (((( 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'. +# 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 + as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: @@ -150,12 +149,13 @@ then : # 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 #( +else case e in #( + e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi " @@ -173,8 +173,9 @@ 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. +else case e in #( + e) exitcode=1; echo positional parameters were not saved. ;; +esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) @@ -188,14 +189,15 @@ 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 +else case e in #( + e) as_have_required=no ;; +esac 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 +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do @@ -228,12 +230,13 @@ IFS=$as_save_IFS if $as_found then : -else $as_nop - if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +else case e in #( + e) 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 ;; +esac fi @@ -255,7 +258,7 @@ case $- in # (((( 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'. +# out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi @@ -275,7 +278,8 @@ $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 -fi +fi ;; +esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} @@ -314,14 +318,6 @@ as_fn_exit () 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 # ------------- @@ -390,11 +386,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -408,21 +405,14 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac 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] # ---------------------------------------- @@ -496,6 +486,8 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits /[$]LINENO/= ' <$as_myself | sed ' + t clear + :clear s/[$]LINENO.*/&-/ t lineno b @@ -544,7 +536,6 @@ esac 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 @@ -556,9 +547,9 @@ 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'. + # 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 @@ -583,10 +574,12 @@ 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'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 /dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + 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 @@ -903,7 +898,7 @@ do 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'" + 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 @@ -1116,7 +1111,7 @@ do 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'" + 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 @@ -1132,7 +1127,7 @@ do 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'" + 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 @@ -1162,8 +1157,8 @@ do | --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" + -*) as_fn_error $? "unrecognized option: '$ac_option' +Try '$0 --help' for more information" ;; *=*) @@ -1171,7 +1166,7 @@ Try \`$0 --help' for more information" # 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'" ;; + as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1221,7 +1216,7 @@ do 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' +# 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 @@ -1289,7 +1284,7 @@ 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_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)` @@ -1317,7 +1312,7 @@ 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. +'configure' configures readline 8.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1331,11 +1326,11 @@ Configuration: --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 + -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' + -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 \`..'] + --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @@ -1343,10 +1338,10 @@ Installation directories: --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'. +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. @@ -1383,7 +1378,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of readline 8.2:";; + short | recursive ) echo "Configuration of readline 8.3:";; esac cat <<\_ACEOF @@ -1400,6 +1395,7 @@ Optional Features: disable bracketed paste by default [[default=enable]] --disable-largefile omit support for large files + --enable-year2038 support timestamps after 2038 Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1420,7 +1416,7 @@ Some influential environment variables: you have headers in a nonstandard directory CPP C preprocessor -Use these variables to override the choices made by `configure' or to help +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 . @@ -1487,10 +1483,10 @@ 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 +readline configure 8.3 +generated by GNU Autoconf 2.72 -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1529,11 +1525,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } && test -s conftest.$ac_objext then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval @@ -1552,8 +1549,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> @@ -1561,10 +1558,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1573,44 +1572,6 @@ printf "%s\n" "$ac_res" >&6; } } # 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 @@ -1623,8 +1584,8 @@ printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 @@ -1654,12 +1615,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - eval "$3=yes" +else case e in #( + e) eval "$3=yes" ;; +esac 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 +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1699,11 +1662,12 @@ printf "%s\n" "$ac_try_echo"; } >&5 } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_retval=1 + ac_retval=1 ;; +esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would @@ -1726,15 +1690,15 @@ 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 +else case e in #( + e) 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. */ + which can conflict with char $2 (void); below. */ #include #undef $2 @@ -1745,7 +1709,7 @@ else $as_nop #ifdef __cplusplus extern "C" #endif -char $2 (); +char $2 (void); /* 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. */ @@ -1764,11 +1728,13 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1807,12 +1773,13 @@ printf "%s\n" "$ac_try_echo"; } >&5 test $ac_status = 0; }; } then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: program exited with status $ac_status" >&5 +else case e in #( + e) 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 + ac_retval=$ac_status ;; +esac fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno @@ -1820,6 +1787,45 @@ fi } # ac_fn_c_try_run +# 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 case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +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_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including @@ -1832,8 +1838,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1849,8 +1855,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int @@ -1866,12 +1872,15 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" -else $as_nop - eval "$4=no" +else case e in #( + e) eval "$4=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$4 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1893,8 +1902,8 @@ 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'` +else case e in #( + e) 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 @@ -1918,12 +1927,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" -else $as_nop - eval "$3=no" +else case e in #( + e) eval "$3=no" ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS - + ;; +esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -1977,18 +1988,19 @@ _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 +else case e in #( + e) 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 + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ;; +esac 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int @@ -2023,20 +2035,23 @@ _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 +else case e in #( + e) 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 + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else $as_nop - ac_lo= ac_hi= +else case e in #( + e) ac_lo= ac_hi= ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. @@ -2059,8 +2074,9 @@ _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 +else case e in #( + e) as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done @@ -2108,8 +2124,9 @@ _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 +It was created by readline $as_me 8.3, which was +generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -2391,10 +2408,10 @@ esac 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;} + || { { 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; } +See 'config.log' for more details" "$LINENO" 5; } fi done @@ -2430,9 +2447,7 @@ 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; +static char *e (char **p, int i) { return p[i]; } @@ -2446,6 +2461,21 @@ static char *f (char * (*g) (char **, int), char **p, ...) return s; } +/* C89 style stringification. */ +#define noexpand_stringify(a) #a +const char *stringified = noexpand_stringify(arbitrary+token=sequence); + +/* C89 style token pasting. Exercises some of the corner cases that + e.g. old MSVC gets wrong, but not very hard. */ +#define noexpand_concat(a,b) a##b +#define expand_concat(a,b) noexpand_concat(a,b) +extern int vA; +extern int vbee; +#define aye A +#define bee B +int *pvA = &expand_concat(v,aye); +int *pvbee = &noexpand_concat(v,bee); + /* 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 @@ -2473,16 +2503,19 @@ 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? +/* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif +// See if C++-style comments work. + #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); +extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare @@ -2532,7 +2565,6 @@ 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) @@ -2598,6 +2630,8 @@ ac_c_conftest_c99_main=' ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; + // Work around memory leak warnings. + free (ia); // Check named initializers. struct named_init ni = { @@ -2619,7 +2653,7 @@ ac_c_conftest_c99_main=' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' -// Does the compiler advertise C11 conformance? +/* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif @@ -2813,8 +2847,9 @@ 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 +else case e in #( + e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; +esac fi @@ -2842,12 +2877,12 @@ for ac_var in $ac_precious_vars; do 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;} + { 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;} + { 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=: ;; ,);; *) @@ -2856,18 +2891,18 @@ printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} 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;} + { 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;} + { 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;} + { 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. @@ -2883,11 +2918,11 @@ printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} 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: 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' + as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## @@ -2909,7 +2944,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" -LIBVERSION=8.2 +LIBVERSION=8.3 @@ -2923,15 +2958,16 @@ 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 +else case e in #( + e) 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 - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } @@ -2958,14 +2994,15 @@ 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 +else case e in #( + e) 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 - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } @@ -3101,8 +3138,8 @@ 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 +else case e in #( + e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' @@ -3114,7 +3151,8 @@ case `${MAKE-make} -f conftest.make 2>/dev/null` in *) eval ac_cv_prog_make_${ac_make}_set=no;; esac -rm -f conftest.make +rm -f conftest.make ;; +esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -3148,8 +3186,8 @@ 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 +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3171,7 +3209,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3193,8 +3232,8 @@ 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 +else case e in #( + e) 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 @@ -3216,7 +3255,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -3251,8 +3291,8 @@ 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 +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3274,7 +3314,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3296,8 +3337,8 @@ 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 +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no @@ -3336,7 +3377,8 @@ if test $ac_prog_rejected = yes; then ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3360,8 +3402,8 @@ 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 +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3383,7 +3425,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3409,8 +3452,8 @@ 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 +else case e in #( + e) 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 @@ -3432,7 +3475,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -3470,8 +3514,8 @@ 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 +else case e in #( + e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -3493,7 +3537,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then @@ -3515,8 +3560,8 @@ 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 +else case e in #( + e) 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 @@ -3538,7 +3583,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then @@ -3567,10 +3613,10 @@ 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;} +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; } +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 @@ -3642,8 +3688,8 @@ printf "%s\n" "$ac_try_echo"; } >&5 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' + # 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. @@ -3663,7 +3709,7 @@ do 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' + # 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. @@ -3674,8 +3720,9 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else $as_nop - ac_file='' +else case e in #( + e) ac_file='' ;; +esac fi if test -z "$ac_file" then : @@ -3684,13 +3731,14 @@ 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;} +{ { 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; } +See 'config.log' for more details" "$LINENO" 5; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; +esac 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; } @@ -3714,10 +3762,10 @@ printf "%s\n" "$ac_try_echo"; } >&5 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'. + # 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 @@ -3727,11 +3775,12 @@ for ac_file in conftest.exe conftest conftest.*; do * ) 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;} +else case e in #( + e) { { 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; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -3747,6 +3796,8 @@ int main (void) { FILE *f = fopen ("conftest.out", "w"); + if (!f) + return 1; return ferror (f) || fclose (f) != 0; ; @@ -3786,26 +3837,27 @@ printf "%s\n" "$ac_try_echo"; } >&5 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;} + { { 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; } +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 +rm -f conftest.$ac_ext conftest$ac_cv_exeext \ + conftest.o conftest.obj 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3837,16 +3889,18 @@ then : break;; esac done -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else case e in #( + e) 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;} +{ { 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; } +See 'config.log' for more details" "$LINENO" 5; } ;; +esac fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext +rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } @@ -3857,8 +3911,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3875,12 +3929,14 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes -else $as_nop - ac_compiler_gnu=no +else case e in #( + e) ac_compiler_gnu=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu - + ;; +esac 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; } @@ -3898,8 +3954,8 @@ 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 +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" @@ -3917,8 +3973,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes -else $as_nop - CFLAGS="" +else case e in #( + e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -3933,8 +3989,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - ac_c_werror_flag=$ac_save_c_werror_flag +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -3951,12 +4007,15 @@ 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 +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac 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; } @@ -3983,8 +4042,8 @@ 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 +else case e in #( + e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4001,25 +4060,28 @@ 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 +CC=$ac_save_CC ;; +esac 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 +else case e in #( + e) 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 +else case e in #( + e) { 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" + CC="$CC $ac_cv_prog_cc_c11" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 + ac_prog_cc_stdc=c11 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -4029,8 +4091,8 @@ 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 +else case e in #( + e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4047,25 +4109,28 @@ 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 +CC=$ac_save_CC ;; +esac 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 +else case e in #( + e) 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 +else case e in #( + e) { 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" + CC="$CC $ac_cv_prog_cc_c99" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 + ac_prog_cc_stdc=c99 ;; +esac fi fi if test x$ac_prog_cc_stdc = xno @@ -4075,8 +4140,8 @@ 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 +else case e in #( + e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -4093,25 +4158,28 @@ 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 +CC=$ac_save_CC ;; +esac 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 +else case e in #( + e) 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 +else case e in #( + e) { 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" + CC="$CC $ac_cv_prog_cc_c89" ;; +esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 + ac_prog_cc_stdc=c89 ;; +esac fi fi @@ -4162,8 +4230,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 @@ -4179,10 +4247,12 @@ _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 +else case e in #( + e) ac_cv_safe_to_define___extensions__=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -4192,8 +4262,8 @@ 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 +else case e in #( + e) ac_cv_should_define__xopen_source=no if test $ac_cv_header_wchar_h = yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4212,8 +4282,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 500 @@ -4231,10 +4301,12 @@ 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 +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -fi +fi ;; +esac 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; } @@ -4259,6 +4331,8 @@ printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h + printf "%s\n" "#define __STDC_WANT_IEC_60559_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 @@ -4278,8 +4352,9 @@ then : printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h -else $as_nop - MINIX= +else case e in #( + e) MINIX= ;; +esac fi if test $ac_cv_safe_to_define___extensions__ = yes then : @@ -4296,353 +4371,34 @@ 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}" +# STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}" + STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security}" 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} + + # 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 - # 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 +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( @@ -4695,7 +4451,8 @@ esac IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir - + ;; +esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install @@ -4726,8 +4483,8 @@ 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 +else case e in #( + e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4749,7 +4506,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then @@ -4771,8 +4529,8 @@ 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 +else case e in #( + e) 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 @@ -4794,7 +4552,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then @@ -4829,8 +4588,8 @@ 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 +else case e in #( + e) if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -4852,7 +4611,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then @@ -4874,8 +4634,8 @@ 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 +else case e in #( + e) 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 @@ -4897,7 +4657,8 @@ done done IFS=$as_save_IFS -fi +fi ;; +esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then @@ -4924,6 +4685,20 @@ else fi + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + + MAKE_SHELL=/bin/sh @@ -4939,8 +4714,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -5004,10 +4779,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_const=yes -else $as_nop - ac_cv_c_const=no +else case e in #( + e) ac_cv_c_const=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 printf "%s\n" "$ac_cv_c_const" >&6; } @@ -5022,8 +4799,8 @@ 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 +else case e in #( + e) ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5041,7 +4818,8 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 printf "%s\n" "$ac_cv_c_inline" >&6; } @@ -5075,8 +4853,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int @@ -5093,10 +4871,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_char_unsigned=no -else $as_nop - ac_cv_c_char_unsigned=yes +else case e in #( + e) ac_cv_c_char_unsigned=yes ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -5110,8 +4890,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -5128,10 +4908,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_volatile=yes -else $as_nop - ac_cv_c_volatile=no +else case e in #( + e) ac_cv_c_volatile=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 printf "%s\n" "$ac_cv_c_volatile" >&6; } @@ -5146,20 +4928,34 @@ 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 - +else case e in #( + e) printf "%s\n" "#define size_t unsigned int" >>confdefs.h - + ;; +esac 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 - +else case e in #( + e) printf "%s\n" "#define ssize_t int" >>confdefs.h + ;; +esac +fi + +ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" +if test "x$ac_cv_type_mode_t" = xyes +then : + +else case e in #( + e) +printf "%s\n" "#define mode_t int" >>confdefs.h + ;; +esac fi @@ -5168,8 +4964,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -5194,10 +4990,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_header_stat_broken=no -else $as_nop - ac_cv_header_stat_broken=yes +else case e in #( + e) ac_cv_header_stat_broken=yes ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -5209,14 +5007,14 @@ 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` + as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | sed "$as_sed_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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> @@ -5233,10 +5031,12 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$as_ac_Header=yes" -else $as_nop - eval "$as_ac_Header=no" +else case e in #( + e) eval "$as_ac_Header=no" ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi eval ac_res=\$$as_ac_Header { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 @@ -5244,7 +5044,7 @@ 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 +#define `printf "%s\n" "HAVE_$ac_hdr" | sed "$as_sed_cpp"` 1 _ACEOF ac_header_dirent=$ac_hdr; break @@ -5258,15 +5058,21 @@ 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 +else case e in #( + e) 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 (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (void); int main (void) { @@ -5297,11 +5103,13 @@ done if test ${ac_cv_search_opendir+y} then : -else $as_nop - ac_cv_search_opendir=no +else case e in #( + e) ac_cv_search_opendir=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 printf "%s\n" "$ac_cv_search_opendir" >&6; } @@ -5318,15 +5126,21 @@ 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 +else case e in #( + e) 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 (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (void); int main (void) { @@ -5357,11 +5171,13 @@ done if test ${ac_cv_search_opendir+y} then : -else $as_nop - ac_cv_search_opendir=no +else case e in #( + e) ac_cv_search_opendir=no ;; +esac fi rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS +LIBS=$ac_func_search_save_LIBS ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 printf "%s\n" "$ac_cv_search_opendir" >&6; } @@ -5477,6 +5293,18 @@ 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" "tcgetwinsize" "ac_cv_func_tcgetwinsize" +if test "x$ac_cv_func_tcgetwinsize" = xyes +then : + printf "%s\n" "#define HAVE_TCGETWINSIZE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "tcsetwinsize" "ac_cv_func_tcsetwinsize" +if test "x$ac_cv_func_tcsetwinsize" = xyes +then : + printf "%s\n" "#define HAVE_TCSETWINSIZE 1" >>confdefs.h + fi ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" if test "x$ac_cv_func_vsnprintf" = xyes @@ -5518,36 +5346,26 @@ then : 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} +ac_fn_c_check_type "$LINENO" "uid_t" "ac_cv_type_uid_t" "$ac_includes_default" +if test "x$ac_cv_type_uid_t" = xyes 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 +else case e in #( + e) printf "%s\n" "#define uid_t int" >>confdefs.h + ;; +esac +fi +ac_fn_c_check_type "$LINENO" "gid_t" "ac_cv_type_gid_t" "$ac_includes_default" +if test "x$ac_cv_type_gid_t" = xyes +then : +else case e in #( + e) printf "%s\n" "#define gid_t int" >>confdefs.h - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working chown" >&5 @@ -5555,8 +5373,8 @@ 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 +else case e in #( + e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on glibc systems. @@ -5564,8 +5382,8 @@ then : # 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include @@ -5593,15 +5411,18 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_chown_works=yes -else $as_nop - ac_cv_func_chown_works=no +else case e in #( + e) ac_cv_func_chown_works=no ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f conftest.chown - + ;; +esac 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; } @@ -5616,8 +5437,8 @@ 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 +else case e in #( + e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on glibc systems. @@ -5625,8 +5446,8 @@ then : # 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int @@ -5642,13 +5463,16 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_strcoll_works=yes -else $as_nop - ac_cv_func_strcoll_works=no +else case e in #( + e) ac_cv_func_strcoll_works=no ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi - + ;; +esac 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; } @@ -5806,31 +5630,34 @@ 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} +if test "$enable_largefile,$enable_year2038" != no,no +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable large file support" >&5 +printf %s "checking for $CC option to enable large file support... " >&6; } +if test ${ac_cv_sys_largefile_opts+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 +else case e in #( + e) ac_save_CC="$CC" + ac_opt_found=no + for ac_opt in "none needed" "-D_FILE_OFFSET_BITS=64" "-D_LARGE_FILES=1" "-n32"; do + if test x"$ac_opt" != x"none needed" +then : + CC="$ac_save_CC $ac_opt" +fi + 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, +#ifndef FTYPE +# define FTYPE off_t +#endif + /* Check that FTYPE can represent 2**63 - 1 correctly. + We can't simply define LARGE_FTYPE 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) +#define LARGE_FTYPE (((FTYPE) 1 << 31 << 31) - 1 + ((FTYPE) 1 << 31 << 31)) + int FTYPE_is_large[(LARGE_FTYPE % 2147483629 == 721 + && LARGE_FTYPE % 2147483647 == 1) ? 1 : -1]; int main (void) @@ -5840,142 +5667,88 @@ main (void) return 0; } _ACEOF - if ac_fn_c_try_compile "$LINENO" +if ac_fn_c_try_compile "$LINENO" then : - break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - CC="$CC -n32" + if test x"$ac_opt" = x"none needed" +then : + # GNU/Linux s390x and alpha need _FILE_OFFSET_BITS=64 for wide ino_t. + CC="$CC -DFTYPE=ino_t" if ac_fn_c_try_compile "$LINENO" then : - ac_cv_sys_largefile_CC=' -n32'; break + +else case e in #( + e) CC="$CC -D_FILE_OFFSET_BITS=64" + if ac_fn_c_try_compile "$LINENO" +then : + ac_opt='-D_FILE_OFFSET_BITS=64' +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam ;; +esac 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 + ac_cv_sys_largefile_opts=$ac_opt + ac_opt_found=yes 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) -{ + test $ac_opt_found = no || break + done + CC="$ac_save_CC" - ; - 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 + test $ac_opt_found = yes || ac_cv_sys_largefile_opts="support not detected" ;; +esac 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 -;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_opts" >&5 +printf "%s\n" "$ac_cv_sys_largefile_opts" >&6; } + +ac_have_largefile=yes +case $ac_cv_sys_largefile_opts in #( + "none needed") : + ;; #( + "supported through gnulib") : + ;; #( + "support not detected") : + ac_have_largefile=no ;; #( + "-D_FILE_OFFSET_BITS=64") : + +printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h + ;; #( + "-D_LARGE_FILES=1") : + +printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h + ;; #( + "-n32") : + CC="$CC -n32" ;; #( + *) : + as_fn_error $? "internal error: bad value for \$ac_cv_sys_largefile_opts" "$LINENO" 5 ;; 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} + +if test "$enable_year2038" != no +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option for timestamps after 2038" >&5 +printf %s "checking for $CC option for timestamps after 2038... " >&6; } +if test ${ac_cv_sys_year2038_opts+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" +else case e in #( + e) ac_save_CPPFLAGS="$CPPFLAGS" + ac_opt_found=no + for ac_opt in "none needed" "-D_TIME_BITS=64" "-D__MINGW_USE_VC2005_COMPAT" "-U_USE_32_BIT_TIME_T -D__MINGW_USE_VC2005_COMPAT"; do + if test x"$ac_opt" != x"none needed" then : - ac_cv_sys_large_files=no; break + CPPFLAGS="$ac_save_CPPFLAGS $ac_opt" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - cat confdefs.h - <<_ACEOF >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]; + + #include + /* Check that time_t can represent 2**32 - 1 correctly. */ + #define LARGE_TIME_T \\ + ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) + int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 + && LARGE_TIME_T % 65537 == 0) + ? 1 : -1]; + int main (void) { @@ -5986,38 +5759,60 @@ main (void) _ACEOF if ac_fn_c_try_compile "$LINENO" then : - ac_cv_sys_large_files=1; break + ac_cv_sys_year2038_opts="$ac_opt" + ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ac_cv_sys_large_files=unknown - break -done + test $ac_opt_found = no || break + done + CPPFLAGS="$ac_save_CPPFLAGS" + test $ac_opt_found = yes || ac_cv_sys_year2038_opts="support not detected" ;; +esac 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 -;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_year2038_opts" >&5 +printf "%s\n" "$ac_cv_sys_year2038_opts" >&6; } + +ac_have_year2038=yes +case $ac_cv_sys_year2038_opts in #( + "none needed") : + ;; #( + "support not detected") : + ac_have_year2038=no ;; #( + "-D_TIME_BITS=64") : + +printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h + ;; #( + "-D__MINGW_USE_VC2005_COMPAT") : + +printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h + ;; #( + "-U_USE_32_BIT_TIME_T"*) : + { { 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 $? "the 'time_t' type is currently forced to be 32-bit. It +will stop working after mid-January 2038. Remove +_USE_32BIT_TIME_T from the compiler flags. +See 'config.log' for more details" "$LINENO" 5; } ;; #( + *) : + as_fn_error $? "internal error: bad value for \$ac_cv_sys_year2038_opts" "$LINENO" 5 ;; esac -rm -rf conftest* - fi + 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 - +else case e in #( + e) if test ${bash_cv_posix_signals+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6039,12 +5834,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_posix_signals=yes -else $as_nop - bash_cv_posix_signals=no - +else case e in #( + e) bash_cv_posix_signals=no + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi @@ -6054,8 +5851,8 @@ else if test ${bash_cv_bsd_signals+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6074,12 +5871,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_bsd_signals=yes -else $as_nop - bash_cv_bsd_signals=no - +else case e in #( + e) bash_cv_bsd_signals=no + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi @@ -6089,8 +5888,8 @@ fi if test ${bash_cv_sysv_signals+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6111,12 +5910,14 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_sysv_signals=yes -else $as_nop - bash_cv_sysv_signals=no - +else case e in #( + e) bash_cv_sysv_signals=no + ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi @@ -6127,7 +5928,8 @@ fi fi fi fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_signal_vintage" >&5 @@ -6149,15 +5951,15 @@ 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 +else case e in #( + e) 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6166,15 +5968,13 @@ else $as_nop #endif #include -typedef void sigfunc(); +typedef void sigfunc(int); volatile int nsigint; #ifdef HAVE_POSIX_SIGNALS sigfunc * -set_signal_handler(sig, handler) - int sig; - sigfunc *handler; +set_signal_handler(int sig, sigfunc *handler) { struct sigaction act, oact; act.sa_handler = handler; @@ -6189,8 +5989,7 @@ set_signal_handler(sig, handler) #endif void -sigint(s) -int s; +sigint(int s) { nsigint++; } @@ -6209,13 +6008,16 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_must_reinstall_sighandlers=no -else $as_nop - bash_cv_must_reinstall_sighandlers=yes +else case e in #( + e) bash_cv_must_reinstall_sighandlers=yes ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_must_reinstall_sighandlers" >&5 @@ -6232,8 +6034,8 @@ 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 +else case e in #( + e) 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;} @@ -6243,8 +6045,8 @@ printf "%s\n" "$as_me: WARNING: cannot check for sigsetjmp/siglongjmp if cross-c bash_cv_func_sigsetjmp=missing fi -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_UNISTD_H @@ -6300,13 +6102,16 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_func_sigsetjmp=present -else $as_nop - bash_cv_func_sigsetjmp=missing +else case e in #( + e) bash_cv_func_sigsetjmp=missing ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_sigsetjmp" >&5 @@ -6321,8 +6126,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6339,11 +6144,13 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : bash_cv_func_lstat=yes -else $as_nop - bash_cv_func_lstat=no +else case e in #( + e) bash_cv_func_lstat=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_func_lstat" >&5 printf "%s\n" "$bash_cv_func_lstat" >&6; } @@ -6357,15 +6164,15 @@ 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 +else case e in #( + e) 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6376,9 +6183,7 @@ else $as_nop #include int -main(c, v) -int c; -char *v[]; +main(int c, char **v) { int r1, r2; char *deflocale, *defcoll; @@ -6410,30 +6215,306 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_func_strcoll_broken=yes -else $as_nop - bash_cv_func_strcoll_broken=no +else case e in #( + e) bash_cv_func_strcoll_broken=no ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi + ;; +esac +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 + + +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 case e in #( + e) # 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 case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +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 case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +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 + ;; +esac +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 case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +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 case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +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 case e in #( + e) { { 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; } ;; +esac +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 egrep -e" >&5 +printf %s "checking for egrep -e... " >&6; } +if test ${ac_cv_path_EGREP_TRADITIONAL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_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_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + : + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + + if test "$ac_cv_path_EGREP_TRADITIONAL" +then : + ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_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_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; 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_TRADITIONAL=$EGREP_TRADITIONAL 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 - + ;; +esac +fi ;; +esac fi - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 +printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } + EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL { 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6444,14 +6525,16 @@ else $as_nop _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "getpwuid" >/dev/null 2>&1 + $EGREP_TRADITIONAL "getpwuid" >/dev/null 2>&1 then : bash_cv_getpw_declared=yes -else $as_nop - bash_cv_getpw_declared=no +else case e in #( + e) bash_cv_getpw_declared=no ;; +esac fi rm -rf conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_getpw_declared" >&5 @@ -6467,25 +6550,23 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +$ac_includes_default #include -#ifdef TIOCGWINSZ - yes -#endif +const int tiocgwinsz = TIOCGWINSZ; _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1 +if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_tiocgwinsz_in_termios_h=yes -else $as_nop - ac_cv_sys_tiocgwinsz_in_termios_h=no +else case e in #( + e) ac_cv_sys_tiocgwinsz_in_termios_h=no ;; +esac fi -rm -rf conftest* - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -6496,25 +6577,23 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +$ac_includes_default #include -#ifdef TIOCGWINSZ - yes -#endif +const int tiocgwinsz = TIOCGWINSZ; _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1 +if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes -else $as_nop - ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no +else case e in #( + e) ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no ;; +esac fi -rm -rf conftest* - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -6541,8 +6620,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -6556,11 +6635,13 @@ _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 +else case e in #( + e) ac_cv_have_sig_atomic_t=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac 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; } @@ -6573,8 +6654,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_STDLIB_H @@ -6593,14 +6674,16 @@ else $as_nop _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "sig_atomic_t" >/dev/null 2>&1 + $EGREP_TRADITIONAL "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 +else case e in #( + e) bash_cv_type_sig_atomic_t=no ;; +esac fi rm -rf conftest* - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_sig_atomic_t" >&5 @@ -6619,8 +6702,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6636,11 +6719,13 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_tiocstat_in_ioctl=yes -else $as_nop - bash_cv_tiocstat_in_ioctl=no - +else case e in #( + e) bash_cv_tiocstat_in_ioctl=no + ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_tiocstat_in_ioctl" >&5 @@ -6655,8 +6740,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6672,11 +6757,13 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_fionread_in_ioctl=yes -else $as_nop - bash_cv_fionread_in_ioctl=no - +else case e in #( + e) bash_cv_fionread_in_ioctl=no + ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_fionread_in_ioctl" >&5 @@ -6691,8 +6778,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -6706,10 +6793,12 @@ _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 +else case e in #( + e) bash_cv_speed_t_in_sys_types=no ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_speed_t_in_sys_types" >&5 @@ -6724,13 +6813,13 @@ 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 - +else case e in #( + e) if test ${bash_cv_struct_winsize_ioctl+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6750,19 +6839,21 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_struct_winsize_ioctl=yes -else $as_nop - bash_cv_struct_winsize_ioctl=no +else case e in #( + e) bash_cv_struct_winsize_ioctl=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - + ;; +esac fi if test ${bash_cv_struct_winsize_termios+y} then : printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -6782,11 +6873,13 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_struct_winsize_termios=yes -else $as_nop - bash_cv_struct_winsize_termios=no +else case e in #( + e) bash_cv_struct_winsize_termios=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - + ;; +esac fi @@ -6798,7 +6891,8 @@ elif test $bash_cv_struct_winsize_termios = yes; then else bash_cv_struct_winsize_header=other fi - + ;; +esac fi if test $bash_cv_struct_winsize_header = ioctl_h; then @@ -6817,13 +6911,6 @@ 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 @@ -6852,28 +6939,10 @@ 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" " @@ -6903,28 +6972,17 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H #include @@ -6943,11 +7001,13 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_struct_timeval=yes -else $as_nop - bash_cv_struct_timeval=no +else case e in #( + e) bash_cv_struct_timeval=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_struct_timeval" >&5 @@ -6970,8 +7030,8 @@ printf %s "checking for $CC options needed to detect all undeclared functions... if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 -else $as_nop - ac_save_CFLAGS=$CFLAGS +else case e in #( + e) 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" @@ -6990,8 +7050,8 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : -else $as_nop - # This test program should compile successfully. +else case e in #( + e) # 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 @@ -7019,26 +7079,29 @@ 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 +else case e in #( + e) ac_cv_c_undeclared_builtin_options=$ac_arg ;; +esac fi break fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS - + ;; +esac 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;} + { { 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; } ;; #( +See 'config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : @@ -7050,8 +7113,9 @@ ac_fn_check_decl "$LINENO" "AUDIT_USER_TTY" "ac_cv_have_decl_AUDIT_USER_TTY" "#i if test "x$ac_cv_have_decl_AUDIT_USER_TTY" = xyes then : ac_have_decl=1 -else $as_nop - ac_have_decl=0 +else case e in #( + e) ac_have_decl=0 ;; +esac fi printf "%s\n" "#define HAVE_DECL_AUDIT_USER_TTY $ac_have_decl" >>confdefs.h @@ -7070,27 +7134,33 @@ 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" +else case e in #( + e) 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 +else case e in #( + e) { 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 +else case e in #( + e) 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 (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char tgetent (void); int main (void) { @@ -7102,34 +7172,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_termcap_tgetent=yes -else $as_nop - ac_cv_lib_termcap_tgetent=no +else case e in #( + e) ac_cv_lib_termcap_tgetent=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac 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 +else case e in #( + e) { 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 +else case e in #( + e) 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 (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char tgetent (void); int main (void) { @@ -7141,34 +7219,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_tinfo_tgetent=yes -else $as_nop - ac_cv_lib_tinfo_tgetent=no +else case e in #( + e) ac_cv_lib_tinfo_tgetent=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac 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 +else case e in #( + e) { 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 +else case e in #( + e) 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 (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char tgetent (void); int main (void) { @@ -7180,34 +7266,42 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_curses_tgetent=yes -else $as_nop - ac_cv_lib_curses_tgetent=no +else case e in #( + e) ac_cv_lib_curses_tgetent=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac 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} +else case e in #( + e) { 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="-lncurses $LIBS" +else case e in #( + e) 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 (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char tgetent (void); int main (void) { @@ -7218,35 +7312,43 @@ return tgetent (); _ACEOF if ac_fn_c_try_link "$LINENO" then : - ac_cv_lib_ncurses_tgetent=yes -else $as_nop - ac_cv_lib_ncurses_tgetent=no + ac_cv_lib_ncursesw_tgetent=yes +else case e in #( + e) ac_cv_lib_ncursesw_tgetent=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac 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 +{ 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=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} + bash_cv_termcap_lib=libncursesw +else case e in #( + e) { 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="-lncursesw $LIBS" +else case e in #( + e) 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 (); + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char tgetent (void); int main (void) { @@ -7257,33 +7359,42 @@ return tgetent (); _ACEOF if ac_fn_c_try_link "$LINENO" then : - ac_cv_lib_ncursesw_tgetent=yes -else $as_nop - ac_cv_lib_ncursesw_tgetent=no + ac_cv_lib_ncurses_tgetent=yes +else case e in #( + e) ac_cv_lib_ncurses_tgetent=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +LIBS=$ac_check_lib_save_LIBS ;; +esac 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 +{ 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=libncursesw -else $as_nop - bash_cv_termcap_lib=gnutermcap + bash_cv_termcap_lib=libncurses +else case e in #( + e) bash_cv_termcap_lib=gnutermcap ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi - + ;; +esac fi if test "X$_bash_needmsg" = "Xyes"; then @@ -7302,9 +7413,15 @@ TERMCAP_DEP= elif test $bash_cv_termcap_lib = libtinfo; then TERMCAP_LIB=-ltinfo TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libncursesw; then +TERMCAP_LIB=-lncursesw +TERMCAP_DEP= elif test $bash_cv_termcap_lib = libncurses; then TERMCAP_LIB=-lncurses TERMCAP_DEP= +elif test $bash_cv_termcap_lib = libcurses; then +TERMCAP_LIB=-lcurses +TERMCAP_DEP= elif test $bash_cv_termcap_lib = libc; then TERMCAP_LIB= TERMCAP_DEP= @@ -7339,6 +7456,7 @@ esac case "$TERMCAP_LIB" in -ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;; -lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; +-lncursesw) TERMCAP_PKG_CONFIG_LIB=ncursesw ;; -lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; -ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;; *) TERMCAP_PKG_CONFIG_LIB=termcap ;; @@ -7350,8 +7468,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -7365,16 +7483,20 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : am_cv_langinfo_codeset=yes -else $as_nop - am_cv_langinfo_codeset=no +else case e in #( + e) am_cv_langinfo_codeset=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - + ;; +esac 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_NL_LANGINFO 1" >>confdefs.h + printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h @@ -7421,7 +7543,7 @@ 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 + printf "%s\n" "#define HAVE_MBSCASECMP 1" >>confdefs.h fi @@ -7432,6 +7554,13 @@ then : fi +ac_fn_c_check_func "$LINENO" "mbsncmp" "ac_cv_func_mbsncmp" +if test "x$ac_cv_func_mbsncmp" = xyes +then : + printf "%s\n" "#define HAVE_MBSNCMP 1" >>confdefs.h + +fi + ac_fn_c_check_func "$LINENO" "mbsnrtowcs" "ac_cv_func_mbsnrtowcs" if test "x$ac_cv_func_mbsnrtowcs" = xyes then : @@ -7452,13 +7581,14 @@ if test "x$ac_cv_func_mbschr" = xyes then : printf "%s\n" "#define HAVE_MBSCHR 1" >>confdefs.h -else $as_nop - case " $LIBOBJS " in +else case e in #( + e) case " $LIBOBJS " in *" mbschr.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS mbschr.$ac_objext" ;; esac - + ;; +esac fi @@ -7497,19 +7627,27 @@ then : fi +ac_fn_c_check_func "$LINENO" "wcsnrtombs" "ac_cv_func_wcsnrtombs" +if test "x$ac_cv_func_wcsnrtombs" = xyes +then : + printf "%s\n" "#define HAVE_WCSNRTOMBS 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 +else case e in #( + e) case " $LIBOBJS " in *" wcswidth.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS wcswidth.$ac_objext" ;; esac - + ;; +esac fi @@ -7519,8 +7657,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -7538,11 +7676,13 @@ _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_func_mbrtowc=yes -else $as_nop - ac_cv_func_mbrtowc=no +else case e in #( + e) ac_cv_func_mbrtowc=no ;; +esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext + conftest$ac_exeext conftest.$ac_ext ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mbrtowc" >&5 printf "%s\n" "$ac_cv_func_mbrtowc" >&6; } @@ -7596,8 +7736,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -7615,11 +7755,13 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_type_wchar_t=yes -else $as_nop - bash_cv_type_wchar_t=no - +else case e in #( + e) bash_cv_type_wchar_t=no + ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -7634,8 +7776,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -7653,11 +7795,13 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_type_wctype_t=yes -else $as_nop - bash_cv_type_wctype_t=no - +else case e in #( + e) bash_cv_type_wctype_t=no + ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -7672,8 +7816,8 @@ 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 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -7691,11 +7835,13 @@ _ACEOF if ac_fn_c_try_compile "$LINENO" then : bash_cv_type_wint_t=yes -else $as_nop - bash_cv_type_wint_t=no - +else case e in #( + e) bash_cv_type_wint_t=no + ;; +esac fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac 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; } @@ -7710,13 +7856,13 @@ printf %s "checking for wcwidth broken with unicode combining characters... " >& if test ${bash_cv_wcwidth_broken+y} then : printf %s "(cached) " >&6 -else $as_nop - if test "$cross_compiling" = yes +else case e in #( + e) if test "$cross_compiling" = yes then : bash_cv_wcwidth_broken=no -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -7727,14 +7873,15 @@ else $as_nop #include int -main(c, v) -int c; -char **v; +main(int c, char **v) { int w; setlocale(LC_ALL, "en_US.UTF-8"); w = wcwidth (0x0301); + if (w != 0) + exit (0); + w = wcwidth (0x200b); exit (w == 0); /* exit 0 if wcwidth broken */ } @@ -7742,13 +7889,16 @@ _ACEOF if ac_fn_c_try_run "$LINENO" then : bash_cv_wcwidth_broken=yes -else $as_nop - bash_cv_wcwidth_broken=no +else case e in #( + e) bash_cv_wcwidth_broken=no ;; +esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac fi - + ;; +esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bash_cv_wcwidth_broken" >&5 printf "%s\n" "$bash_cv_wcwidth_broken" >&6; } @@ -7773,28 +7923,30 @@ 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]];'. +# 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" +else case e in #( + e) 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;} +else case e in #( + e) 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; } +See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_wchar_t=0 - fi + fi ;; +esac fi - + ;; +esac 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; } @@ -7919,6 +8071,7 @@ CFLAGS="$CFLAGS $STYLE_CFLAGS" + ac_config_files="$ac_config_files Makefile doc/Makefile examples/Makefile shlib/Makefile readline.pc history.pc" @@ -7935,8 +8088,8 @@ cat >confcache <<\_ACEOF # 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 +# '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 @@ -7966,14 +8119,14 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} (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 + # '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. + # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | @@ -8034,6 +8187,12 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +# Check whether --enable-year2038 was given. +if test ${enable_year2038+y} +then : + enableval=$enable_year2038; +fi + : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 @@ -8063,7 +8222,6 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # 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 @@ -8072,12 +8230,13 @@ then : # 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 #( +else case e in #( + e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; +esac ;; esac fi @@ -8149,7 +8308,7 @@ IFS=$as_save_IFS ;; esac -# We did not find ourselves, most probably we were run as `sh COMMAND' +# 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 @@ -8178,7 +8337,6 @@ as_fn_error () } # as_fn_error - # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -8218,11 +8376,12 @@ then : { eval $1+=\$2 }' -else $as_nop - as_fn_append () +else case e in #( + e) as_fn_append () { eval $1=\$$1\$2 - } + } ;; +esac fi # as_fn_append # as_fn_arith ARG... @@ -8236,11 +8395,12 @@ then : { as_val=$(( $* )) }' -else $as_nop - as_fn_arith () +else case e in #( + e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` - } + } ;; +esac fi # as_fn_arith @@ -8323,9 +8483,9 @@ 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'. + # 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 @@ -8406,10 +8566,12 @@ 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'" +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 @@ -8424,8 +8586,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # 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 +This file was extended by readline $as_me 8.3, which was +generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -8457,7 +8619,7 @@ _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions +'$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. @@ -8492,11 +8654,11 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ 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, +readline config.status 8.3 +configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -8556,8 +8718,8 @@ do ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; + 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 \ @@ -8565,8 +8727,8 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; + -*) as_fn_error $? "unrecognized option: '$1' +Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; @@ -8623,7 +8785,7 @@ do "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;; + *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done @@ -8643,7 +8805,7 @@ fi # 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'. +# after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= @@ -8667,7 +8829,7 @@ 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'. +# This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then @@ -8825,13 +8987,13 @@ 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'. +# 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 +# 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. @@ -8941,7 +9103,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -8963,19 +9125,19 @@ do -) 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 `:'. + # 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;; + 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 + # 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 '` @@ -9103,7 +9265,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 esac _ACEOF -# Neutralize VPATH when `$srcdir' = `.'. +# 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 @@ -9133,9 +9295,9 @@ 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' + { 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' +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" diff --git a/configure.ac b/configure.ac index 15501fa..5599d12 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ 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. +# Copyright (C) 1987-2024 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 @@ -20,9 +20,9 @@ dnl Process this file with autoconf to produce a configure script. # 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_REVISION([for Readline 8.3, version 2.103]) -AC_INIT(readline, 8.2, bug-readline@gnu.org) +AC_INIT(readline, 8.3, bug-readline@gnu.org) dnl make sure we are using a recent autoconf version AC_PREREQ(2.69) @@ -32,7 +32,7 @@ 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 +LIBVERSION=8.3 AC_CANONICAL_HOST AC_CANONICAL_BUILD @@ -118,10 +118,12 @@ 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}" +# STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security} ${GCC:+-Wno-tautological-constant-out-of-range-compare}" + STYLE_CFLAGS="${GCC:+-Wno-parentheses} ${GCC:+-Wno-format-security}" fi -AC_PROG_GCC_TRADITIONAL +dnl this macro is obsolete +dnl 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. @@ -129,6 +131,8 @@ dnl This allows people to set it when running configure or make test -n "$ARFLAGS" || ARFLAGS="cr" AC_PROG_RANLIB +AM_PROG_INSTALL_SH + MAKE_SHELL=/bin/sh AC_SUBST(MAKE_SHELL) @@ -145,12 +149,15 @@ AC_C_VOLATILE AC_TYPE_SIZE_T AC_CHECK_TYPE(ssize_t, int) +AC_TYPE_MODE_T + 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(fnmatch memmove putenv setenv setlocale strcasecmp \ + strpbrk sysconf tcgetattr tcgetwinsize tcsetwinsize \ + vsnprintf) AC_CHECK_FUNCS(isascii isxdigit) AC_CHECK_FUNCS(getpwent getpwnam getpwuid) @@ -220,6 +227,7 @@ esac case "$TERMCAP_LIB" in -ltinfo) TERMCAP_PKG_CONFIG_LIB=tinfo ;; -lcurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; +-lncursesw) TERMCAP_PKG_CONFIG_LIB=ncursesw ;; -lncurses) TERMCAP_PKG_CONFIG_LIB=ncurses ;; -ltermcap) TERMCAP_PKG_CONFIG_LIB=termcap ;; *) TERMCAP_PKG_CONFIG_LIB=termcap ;; @@ -325,6 +333,7 @@ AC_SUBST(CFLAGS) AC_SUBST(LOCAL_CFLAGS) AC_SUBST(LOCAL_LDFLAGS) AC_SUBST(LOCAL_DEFS) +AC_SUBST(STYLE_CFLAGS) AC_SUBST(AR) AC_SUBST(ARFLAGS) diff --git a/display.c b/display.c index 803d4ce..9aa8c7b 100644 --- a/display.c +++ b/display.c @@ -1,6 +1,6 @@ /* display.c -- readline redisplay facility. */ -/* Copyright (C) 1987-2022 Free Software Foundation, Inc. +/* Copyright (C) 1987-2025 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. @@ -59,10 +59,6 @@ #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); @@ -282,6 +278,10 @@ static int prompt_physical_chars; characters in the prompt or use heuristics about where they are. */ static int *local_prompt_newlines; +/* An array saying how many invisible characters are in each line of the + prompt. */ +static int *local_prompt_invis_chars; + /* 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; @@ -295,6 +295,7 @@ static int line_totbytes; static char *saved_local_prompt; static char *saved_local_prefix; static int *saved_local_prompt_newlines; +static int *saved_local_prompt_invis_chars; static int saved_last_invisible; static int saved_visible_length; @@ -356,7 +357,7 @@ 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 mlen, newlines, newlines_guess, bound, can_add_invis, lastinvis; int mb_cur_max; /* We only expand the mode string for the last line of a multiline prompt @@ -399,7 +400,8 @@ expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp) *vlp = l; local_prompt_newlines = (int *) xrealloc (local_prompt_newlines, sizeof (int) * 2); - local_prompt_newlines[0] = 0; + local_prompt_invis_chars = (int *) xrealloc (local_prompt_invis_chars, sizeof (int) * 2); + local_prompt_newlines[0] = local_prompt_invis_chars[0] = 0; local_prompt_newlines[1] = -1; return r; @@ -414,15 +416,20 @@ expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp) 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; + local_prompt_invis_chars = (int *) xrealloc (local_prompt_invis_chars, sizeof (int) * (newlines_guess + 1)); + local_prompt_invis_chars[0] = 0; for (rl = 1; rl <= newlines_guess; rl++) - local_prompt_newlines[rl] = -1; + { + local_prompt_newlines[rl] = -1; + local_prompt_invis_chars[rl] = 0; + } 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++) + for (ignoring = last = ninvis = lastinvis = 0, p = nprompt; p && *p; p++) { /* This code strips the invisible character string markers RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */ @@ -447,6 +454,8 @@ expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp) counter. */ if (invflset && newlines == 1) invfl = ninvis; + local_prompt_invis_chars[newlines - 1] = ninvis - lastinvis; + lastinvis = ninvis; } if (p != (igstart + 1)) last = r - ret - 1; @@ -511,6 +520,8 @@ expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp) else new = r - ret; local_prompt_newlines[++newlines] = new; + local_prompt_invis_chars[newlines - 1] = ninvis - lastinvis; + lastinvis = ninvis; } /* What if a physical character of width >= 2 is split? There is @@ -525,6 +536,9 @@ expand_prompt (char *pmt, int flags, int *lp, int *lip, int *niflp, int *vlp) if (rl <= _rl_screenwidth) invfl = ninvis; + /* Make sure we account for invisible characters on the last line. */ + local_prompt_invis_chars[newlines] = ninvis - lastinvis; + *r = '\0'; if (lp) *lp = rl; @@ -591,13 +605,22 @@ rl_expand_prompt (char *prompt) FREE (local_prompt); FREE (local_prompt_prefix); + /* Set default values for variables expand_prompt sets */ 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 (local_prompt_invis_chars == 0) + local_prompt_invis_chars = (int *)xmalloc (sizeof (int)); + local_prompt_invis_chars[0] = 0; + if (prompt == 0 || *prompt == 0) - return (0); + { + local_prompt = xmalloc (sizeof (char)); + local_prompt[0] = '\0'; + return (0); + } p = strrchr (prompt, '\n'); if (p == 0) @@ -641,8 +664,8 @@ rl_expand_prompt (char *prompt) static void realloc_line (int minsize) { - int minimum_size; - int newsize, delta; + size_t minimum_size; + size_t newsize, delta; minimum_size = DEFAULT_LINE_BUFFER_SIZE; if (minsize < minimum_size) @@ -684,7 +707,7 @@ init_line_structures (int minsize) if (line_size > minsize) minsize = line_size; } - realloc_line (minsize); + realloc_line (minsize); if (vis_lbreaks == 0) { @@ -758,16 +781,39 @@ _rl_optimize_redisplay (void) _rl_quick_redisplay = 1; } +/* Useful shorthand used by rl_redisplay, update_line, rl_move_cursor_relative */ +#define INVIS_FIRST() (local_prompt_invis_chars[0]) +#define WRAP_OFFSET(line, offset) ((line <= prompt_last_screen_line) ? local_prompt_invis_chars[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 INV_CHARS_CURRENT_PROMPT_LINE(line) \ + (local_prompt_invis_chars[line] > 0) + +#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) + /* 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; + int newlines, lpos, temp, num; char *prompt_this_line; char cur_face; int hl_begin, hl_end; + int short_circuit; int mb_cur_max = MB_CUR_MAX; #if defined (HANDLE_MULTIBYTE) WCHAR_T wc; @@ -953,7 +999,7 @@ rl_redisplay (void) 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; + lpos = local_prompt ? prompt_physical_chars + modmark : 0; #if defined (HANDLE_MULTIBYTE) memset (line_state_invisible->wrapped_line, 0, line_state_invisible->wbsize * sizeof (int)); @@ -964,9 +1010,9 @@ rl_redisplay (void) 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; + /* XXX - There is code that assumes that all the invisible characters occur + on the first and last prompt lines; change that to use + local_prompt_invis_chars */ /* what if lpos is already >= _rl_screenwidth before we start drawing the contents of the command line? */ @@ -982,6 +1028,7 @@ rl_redisplay (void) } /* Now set lpos from the last newline */ + /* XXX - change to use local_prompt_invis_chars[] */ 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 @@ -1044,6 +1091,8 @@ rl_redisplay (void) wc_width = (temp >= 0) ? temp : 1; } } + else + wc_width = 1; /* make sure it's set for the META_CHAR check */ #endif if (in == rl_point) @@ -1053,31 +1102,32 @@ rl_redisplay (void) } #if defined (HANDLE_MULTIBYTE) - if (META_CHAR (c) && _rl_output_meta_chars == 0) /* XXX - clean up */ + if (META_CHAR (c) && wc_bytes == 1 && wc_width == 1) #else if (META_CHAR (c)) #endif { +#if 0 + /* TAG: readline-8.4 20230227 */ + /* https://savannah.gnu.org/support/index.php?110830 + asking for non-printing meta characters to be printed using an + escape sequence. */ + + /* isprint(c) handles bytes up to UCHAR_MAX */ + if (_rl_output_meta_chars == 0 || isprint (c) == 0) +#else if (_rl_output_meta_chars == 0) +#endif { char obuf[5]; int olen; +#if defined (HAVE_VSNPRINTF) + olen = snprintf (obuf, sizeof (obuf), "\\%o", c); +#else 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); @@ -1249,26 +1299,6 @@ rl_redisplay (void) 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 @@ -1283,9 +1313,54 @@ rl_redisplay (void) norm_face (INV_LINE_FACE(linenum), INV_LLEN (linenum)); } + /* XXX - experimental new code */ + /* Now that _rl_last_v_pos is a logical count, not bounded by the + number of physical screen lines, this is a start at being able + to redisplay lines that consume more than the number of physical + screen lines in more than a simple `move-to-the-next-line' way. + + If the new line has more lines than there are physical screen + lines, and the cursor would be off the top of the screen if we + displayed all the new lines, clear the screen without killing + the scrollback buffer, clear out the visible line so we do a + complete redraw, and make the loop break when we have displayed + a physical screen full of lines. Do the same if we are going to + move the cursor to a line that's greater than the number of + physical screen lines when we weren't before. + + SHORT_CIRCUIT says where to break the loop. Pretty simple right now. */ + short_circuit = -1; + if (inv_botlin >= _rl_screenheight) + { + int extra; + + extra = inv_botlin - _rl_screenheight; /* lines off the top */ + /* cursor in portion of line that would be off screen or in + the lines that exceed the number of physical screen lines. */ + if (cursor_linenum <= extra || + (cursor_linenum >= _rl_screenheight && _rl_vis_botlin <= _rl_screenheight)) + { + if (cursor_linenum <= extra) + short_circuit = _rl_screenheight; + _rl_clear_screen (0); + if (visible_line) + memset (visible_line, 0, line_size); + rl_on_new_line (); + } + /* The cursor is beyond the number of lines that would be off + the top, but we still want to display only the first + _RL_SCREENHEIGHT lines starting at the beginning of the line. */ + else if (cursor_linenum > extra && cursor_linenum <= _rl_screenheight && + _rl_vis_botlin <= _rl_screenheight) + short_circuit = _rl_screenheight; + } + /* For each line in the buffer, do the updating display. */ for (linenum = 0; linenum <= inv_botlin; linenum++) { + if (short_circuit >= 0 && linenum == short_circuit) + break; + /* 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; @@ -1319,6 +1394,7 @@ rl_redisplay (void) 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 */ + /* XXX - use local_prompt_invis_chars[linenum] */ _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line); /* If this is the line with the prompt, we might need to @@ -1388,20 +1464,29 @@ rl_redisplay (void) ((linenum == _rl_vis_botlin) ? strlen (tt) : _rl_screenwidth); } } - _rl_vis_botlin = inv_botlin; + _rl_vis_botlin = (short_circuit >= 0) ? short_circuit : 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) { + int physpos; + + /* The physpos calculation is to account for lines with differing + numbers of invisible characters. */ + if (mb_cur_max == 1 || rl_byte_oriented) + physpos = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset); + + /* Move to the line where the cursor will be. */ _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; + if ((mb_cur_max == 1 || rl_byte_oriented) && cursor_linenum == prompt_last_screen_line) + _rl_last_c_pos = physpos + WRAP_OFFSET (cursor_linenum, wrap_offset); } /* Now we move the cursor to where it needs to be. First, make @@ -1414,18 +1499,53 @@ rl_redisplay (void) 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) + if (cursor_linenum == prompt_last_screen_line) { - _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; + int pmt_offset = local_prompt_newlines ? local_prompt_newlines[cursor_linenum] : 0; + int curline_invchars = local_prompt_invis_chars ? local_prompt_invis_chars[cursor_linenum] : wrap_offset; + int cursor_bufpos; + + /* cursor_bufpos is where the portion of the prompt that appears + on the current screen line begins in the buffer. It is a + buffer position, an index into curline + (local_prompt + pmt_offset) */ + cursor_bufpos = pmt_offset; + if (mb_cur_max == 1 || rl_byte_oriented) + cursor_bufpos += _rl_last_c_pos; else - _rl_last_c_pos = nleft + modmark; + cursor_bufpos += _rl_last_c_pos + curline_invchars; + + if (local_prompt && local_prompt_invis_chars[cursor_linenum] && + _rl_last_c_pos > 0 && + cursor_bufpos <= prompt_last_invisible) + { + _rl_cr (); + if (modmark) + _rl_output_some_chars ("*", 1); + + /* If the number of characters in local_prompt is greater + than the screen width, the prompt wraps. We only want to + print the portion after the line wrap. */ + + /* Make sure we set _rl_last_c_pos based on the number of + characters we actually output, since we start at column 0. */ + if (cursor_linenum > 0 && pmt_offset > 0 && nleft > pmt_offset) + _rl_output_some_chars (local_prompt + pmt_offset, nleft - pmt_offset); + else + { + _rl_output_some_chars (local_prompt, nleft); + pmt_offset = 0; /* force for calculation below */ + } + + if (mb_cur_max > 1 && rl_byte_oriented == 0) + /* Start width calculation where we started output. */ + _rl_last_c_pos = _rl_col_width (local_prompt, pmt_offset, nleft, 1) - WRAP_OFFSET(cursor_linenum, wrap_offset) + modmark; + else + /* Index into invisible_line+inv_lbreaks[cursor_linenum], + since that's what we use in the call to + _rl_move_cursor_relative below. */ + _rl_last_c_pos = nleft + modmark - inv_lbreaks[cursor_linenum]; /* buffer position */ + } } /* Where on that line? And where does that line start @@ -1444,6 +1564,7 @@ rl_redisplay (void) the prompt, and there's no good way to tell it, we compensate for those characters here and call _rl_backspace() directly if necessary */ + /* XXX - might need to check cursor_linenum == prompt_last_screen_line like above. */ if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos) { /* TX == new physical cursor position in multibyte locale. */ @@ -1652,7 +1773,7 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l { char *ofd, *ols, *oe, *nfd, *nls, *ne; char *ofdf, *nfdf, *olsf, *nlsf; - int temp, lendiff, wsatend, od, nd, twidth, o_cpos; + int temp, lendiff, wsatend, od, nd, o_cpos; int current_invis_chars; int col_lendiff, col_temp; int bytes_to_insert; @@ -1783,8 +1904,7 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l _rl_output_some_chars below. */ if (newwidth > 0) { - int count, i, j; - char *optr; + int i, j; puts_face (new, new_face, newbytes); _rl_last_c_pos = newwidth; @@ -1895,6 +2015,8 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l /* See comments at dumb_update: for an explanation of this heuristic */ if (nmax < omax) goto clear_rest_of_line; + /* XXX - need to use WRAP_OFFSET(current_line, wrap_offset) instead of + W_OFFSET - XXX */ else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset))) goto clear_rest_of_line; else @@ -1981,7 +2103,11 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l 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 0 if (t > 0 && UNICODE_COMBINING_CHAR (wc) && WCWIDTH (wc) == 0) +#else + if (t > 0 && IS_COMBINING_CHAR (wc)) +#endif { old_offset = _rl_find_prev_mbchar (old, ofd - old, MB_FIND_ANY); new_offset = _rl_find_prev_mbchar (new, nfd - new, MB_FIND_ANY); @@ -1998,6 +2124,8 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l #if defined (HANDLE_MULTIBYTE) /* Find the last character that is the same between the two lines. This bounds the region that needs to change. */ + /* In this case, `last character' means the one farthest from the end of + the line. */ if (mb_cur_max > 1 && rl_byte_oriented == 0) { ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY); @@ -2014,7 +2142,7 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l *olsf != *nlsf) break; - if (*ols == ' ') + if (*ols != ' ') wsatend = 0; ols = old + _rl_find_prev_mbchar (old, ols - old, MB_FIND_ANY); @@ -2076,14 +2204,30 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l } /* count of invisible characters in the current invisible line. */ - current_invis_chars = W_OFFSET (current_line, wrap_offset); + current_invis_chars = WRAP_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) + /* This first clause handles the case where the prompt has been + recalculated (e.g., by rl_message) but the old prompt is still on + the visible line because we haven't overwritten it yet. We want + to somehow use the old prompt information, but we only want to do + this once. */ + if (current_line == 0 && saved_local_prompt && old[0] == saved_local_prompt[0] && memcmp (old, saved_local_prompt, saved_local_length) == 0) + visible_wrap_offset = saved_invis_chars_first_line; + /* This clause handles the opposite: the prompt has been restored (e.g., + by rl_clear_message) but the old saved_local_prompt (now NULL, so we + can't directly check it) is still on the visible line because we + haven't overwritten it yet. We guess that there aren't any invisible + characters in any of the prompts we put in with rl_message */ + else if (current_line == 0 && local_prompt && new[0] == local_prompt[0] && + (memcmp (new, local_prompt, local_prompt_len) == 0) && + (memcmp (old, local_prompt, local_prompt_len) != 0)) + visible_wrap_offset = 0; + else 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) @@ -2140,6 +2284,7 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l else /* We take wrap_offset into account here so we can pass correct information to _rl_move_cursor_relative. */ + /* XXX - can use local_prompt_invis_chars[0] instead of wrap_offset */ _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff, 1) - wrap_offset + modmark; cpos_adjusted = 1; } @@ -2183,6 +2328,7 @@ dumb_update: 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. */ + /* XXX - CHANGE THIS USING local_prompt_invis_chars[current_line] */ if (wrap_offset > prompt_invis_chars_first_line && current_line == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth && @@ -2201,6 +2347,20 @@ dumb_update: wrap_offset >= prompt_invis_chars_first_line && _rl_horizontal_scroll_mode == 0) ADJUST_CPOS (prompt_invis_chars_first_line); + /* XXX - This is experimental. It's a start at supporting + prompts where a non-terminal line contains the last + invisible characters. We assume that we can use the + local_prompt_invis_chars array and that the current line + is completely filled with characters to _rl_screenwidth, + so we can either adjust by the number of bytes in the + current line or just go straight to _rl_screenwidth */ + else if (current_line > 0 && current_line < prompt_last_screen_line && + INV_CHARS_CURRENT_PROMPT_LINE(current_line) && + _rl_horizontal_scroll_mode == 0) + { + _rl_last_c_pos = _rl_screenwidth; + cpos_adjusted = 1; + } } else _rl_last_c_pos += temp; @@ -2212,6 +2372,8 @@ dumb_update: know for sure, so we use another heuristic calclulation below. */ if (nmax < omax) goto clear_rest_of_line; /* XXX */ + /* XXX - use WRAP_OFFSET(current_line, wrap_offset) here instead of + W_OFFSET since current_line == 0 */ else if ((nmax - W_OFFSET(current_line, wrap_offset)) < (omax - W_OFFSET (current_line, visible_wrap_offset))) goto clear_rest_of_line; else @@ -2680,8 +2842,6 @@ rl_on_new_line_with_prompt (void) int rl_forced_update_display (void) { - register char *temp; - if (visible_line) memset (visible_line, 0, line_size); @@ -2763,7 +2923,7 @@ _rl_move_cursor_relative (int new, const char *data, const char *dataf) (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]) + if (data > invisible_line && _rl_inv_botlin < inv_lbsize && 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 @@ -2866,9 +3026,25 @@ _rl_move_vert (int to) { register int delta, i; - if (_rl_last_v_pos == to || to > _rl_screenheight) + if (_rl_last_v_pos == to) return; +#if 0 + /* If we're being asked to move to a line beyond the screen height, and + we're currently at the last physical line, issue a newline and let the + terminal take care of scrolling the display. */ + if (to >= _rl_screenheight) + { + if (_rl_last_v_pos == _rl_screenheight) + { + putc ('\n', rl_outstream); + _rl_cr (); + _rl_last_c_pos = 0; + } + return; + } +#endif + if ((delta = to - _rl_last_v_pos) > 0) { for (i = 0; i < delta; i++) @@ -2952,29 +3128,15 @@ rl_character_len (int c, int pos) 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); @@ -2987,12 +3149,7 @@ rl_message (va_alist) 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 @@ -3023,40 +3180,6 @@ rl_message (va_alist) 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 @@ -3098,10 +3221,12 @@ rl_save_prompt (void) saved_invis_chars_first_line = prompt_invis_chars_first_line; saved_physical_chars = prompt_physical_chars; saved_local_prompt_newlines = local_prompt_newlines; + saved_local_prompt_invis_chars = local_prompt_invis_chars; local_prompt = local_prompt_prefix = (char *)0; local_prompt_len = 0; local_prompt_newlines = (int *)0; + local_prompt_invis_chars = (int *)0; prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0; prompt_invis_chars_first_line = prompt_physical_chars = 0; @@ -3113,11 +3238,13 @@ rl_restore_prompt (void) FREE (local_prompt); FREE (local_prompt_prefix); FREE (local_prompt_newlines); + FREE (local_prompt_invis_chars); local_prompt = saved_local_prompt; local_prompt_prefix = saved_local_prefix; local_prompt_len = saved_local_length; local_prompt_newlines = saved_local_prompt_newlines; + local_prompt_invis_chars = saved_local_prompt_invis_chars; prompt_prefix_length = saved_prefix_length; prompt_last_invisible = saved_last_invisible; @@ -3130,7 +3257,7 @@ rl_restore_prompt (void) 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; + saved_local_prompt_newlines = saved_local_prompt_invis_chars = 0; } char * @@ -3318,7 +3445,7 @@ _rl_update_final (void) full_lines = 1; } _rl_move_vert (_rl_vis_botlin); - woff = W_OFFSET(_rl_vis_botlin, wrap_offset); + woff = W_OFFSET(_rl_vis_botlin, wrap_offset); /* XXX - 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) @@ -3327,7 +3454,7 @@ _rl_update_final (void) /* 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, + This needs to be done both for 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); */ diff --git a/doc/Makefile.in b/doc/Makefile.in index 20a3618..b0ac6d9 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -1,7 +1,7 @@ # This makefile for Readline library documentation is in -*- text -*- mode. # Emacs likes it that way. -# Copyright (C) 1996-2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2024 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 @@ -38,7 +38,7 @@ man3ext = .3 man3dir = $(mandir)/$(manpfx)3 # set this to a value to have the HTML documentation installed -htmldir = +htmldir = @htmldir@ # Support an alternate destination root directory for package building DESTDIR = @@ -73,7 +73,7 @@ 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 +NROFF = groff -Tascii -P -c # This should be a program that converts troff to postscript GROFF = groff @@ -83,7 +83,7 @@ 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 +PDFOBJ = readline.pdf history.pdf rluserman.pdf readline_3.pdf history_3.pdf INTERMEDIATE_OBJ = rlman.dvi @@ -95,9 +95,17 @@ DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) $(PDFOBJ) $(RM) $@ -${NROFF} -man $< > $@ -.ps.pdf: +.3.pdf: $(RM) $@ - -${PSPDF} $< + -${GROFF} -man -T pdf $< > $@ + +.3.ps: + $(RM) $@ + -${GROFF} -man $< > $@ + +#.ps.pdf: +# $(RM) $@ +# -${PSPDF} $< .dvi.pdf: $(RM) $@ @@ -107,8 +115,9 @@ DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) $(PDFOBJ) # $(RM) $@ # -${TEXI2PDF} $< -all: info dvi html ps text pdf +all: info html text pdf dvi nodvi: info html text +everything: all ps xdist: $(DIST_DOCS) @@ -120,24 +129,38 @@ text: $(TEXTOBJ) pdf: $(PDFOBJ) readline.dvi: $(RLSRC) - TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texi - mv rlman.dvi readline.dvi + $(RM) $@ + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) -o $@ $(srcdir)/rlman.texi readline.info: $(RLSRC) + $(RM) $@ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texi +readline.pdf: $(RLSRC) + $(RM) $@ + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) -o $@ $(srcdir)/rlman.texi + rluserman.dvi: $(RLSRC) + $(RM) $@ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rluserman.texi rluserman.info: $(RLSRC) + $(RM) $@ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rluserman.texi +rluserman.pdf: $(RLSRC) + $(RM) $@ + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) -o $@ $(srcdir)/rlman.texi + history.dvi: ${HISTSRC} TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/history.texi history.info: ${HISTSRC} $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/history.texi +history.pdf: $(HISTSRC) + TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/history.texi + readline.ps: readline.dvi $(RM) $@ $(DVIPS) readline.dvi @@ -154,7 +177,7 @@ history.ps: 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 + $(MAKEINFO) -o $@ --html --no-split -I$(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texi rlman.html: ${RLSRC} $(MAKEINFO) -o $@ --html --no-split -I$(TEXINPUTDIR) $(srcdir)/rlman.texi @@ -166,47 +189,47 @@ history.html: ${HISTSRC} $(MAKEINFO) --html --no-split -I$(TEXINPUTDIR) $(srcdir)/history.texi readline.0: readline.3 +history.0: history.3 readline_3.ps: $(srcdir)/readline.3 - ${RM} $@ - ${GROFF} -man < $(srcdir)/readline.3 > $@ + $(RM) $@ + -${GROFF} -man $< > $@ -history.0: history.3 +readline_3.pdf: $(srcdir)/readline.3 + $(RM) $@ + -${GROFF} -man -T pdf $< > $@ 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 $@ + $(RM) $@ + -${GROFF} -man $< > $@ -history.pdf: $(HISTSRC) - TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/history.texi +history_3.pdf: $(srcdir)/history.3 + $(RM) $@ + -${GROFF} -man -T pdf $< > $@ -rluserman.pdf: $(RLSRC) - TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2PDF) $(srcdir)/rluserman.texi +.PHONY: clean maintainer-clean distclean mostlyclean maybe-clean -clean: +mostlyclean: $(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 +clean: mostlyclean distclean: clean maybe-clean $(RM) $(INTERMEDIATE_OBJ) $(RM) Makefile maybe-clean: - -if test "X$(topdir)" != "X.." && test "X$(topdir)" != "X$(BUILD_DIR)"; then \ + -TD=$$(cd $(topdir) && pwd -P) ; \ + BD=$$(cd $(BUILD_DIR) && pwd -P) ; \ + if test "X$$TD" != "X$$BD"; then \ $(RM) $(DIST_DOCS); \ fi maintainer-clean: clean $(RM) $(DIST_DOCS) $(RM) $(INTERMEDIATE_OBJ) - $(RM) $(PDFOBJ) $(RM) Makefile installdirs: $(topdir)/support/mkdirs @@ -259,6 +282,29 @@ install: installdirs fi ; \ fi +install-html: html + -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 + +install-dvi: +install-pdf: +install-ps: + uninstall: $(RM) $(DESTDIR)$(infodir)/readline.info $(RM) $(DESTDIR)$(infodir)/rluserman.info @@ -270,3 +316,10 @@ uninstall: $(RM) $(DESTDIR)$(htmldir)/rluserman.html ; \ $(RM) $(DESTDIR)$(htmldir)/history.html ; \ fi + +uninstall-html: + -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/history.0 b/doc/history.0 index 2bf3b1a..1b94885 100644 --- a/doc/history.0 +++ b/doc/history.0 @@ -1,23 +1,28 @@ -HISTORY(3) Library Functions Manual HISTORY(3) +_H_I_S_T_O_R_Y(3) Library Functions Manual _H_I_S_T_O_R_Y(3) - - -NAME +NNAAMMEE history - GNU History Library -COPYRIGHT - The GNU History Library is Copyright (C) 1989-2020 by the Free Software +CCOOPPYYRRIIGGHHTT + The GNU History Library is Copyright (C) 1989-2025 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 +DDEESSCCRRIIPPTTIIOONN + 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 when 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 + The History library provides functions that allow applications to their + _h_i_s_t_o_r_y, the set of previously-typed lines, which it keeps in a list. + Applications can choose which lines to save into a history list, how + many commands to save, save a history list to a file, read a history + list from a file, and display lines from the history in various for- + mats. + +HHIISSTTOORRYY EEXXPPAANNSSIIOONN + The history library supports a history expansion feature that is iden- + tical to the history expansion in bbaasshh. This section describes what syntax features are available. History expansions introduce words from the history list into the input @@ -25,116 +30,139 @@ HISTORY(3) Library Functions Manual HISTORY(3) 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[?] + History expansion is usually performed immediately after a complete + line is read. It takes place in two parts. The first is to determine + which history list entry to use during substitution. The second is to + select portions of that entry to include into the current one. + + The entry selected from the history is the _e_v_e_n_t, and the portions of + that entry that are acted upon are _w_o_r_d_s. Various _m_o_d_i_f_i_e_r_s are avail- + able to manipulate the selected words. The entry is split into words + in the same fashion as bbaasshh 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 hhiissttoorryy__ttookkeenniizzee(()) below). + The _e_v_e_n_t _d_e_s_i_g_n_a_t_o_r selects the event, the optional _w_o_r_d _d_e_s_i_g_n_a_t_o_r + selects words from the event, and various optional _m_o_d_i_f_i_e_r_s are avail- + able to manipulate the selected words. + + History expansions are introduced by the appearance of the history ex- + pansion character, which is !! by default. History expansions may ap- + pear anywhere in the input, but do not nest. + + Only backslash (\\) and single quotes can quote the history expansion + character. + + There is a special abbreviation for substitution, active when the _q_u_i_c_k + _s_u_b_s_t_i_t_u_t_i_o_n character (default ^^) is the first character on the line. + It selects the previous history list entry, using an event designator + equivalent to !!!!, and substitutes one string for another in that entry. + It is described below under EEvveenntt DDeessiiggnnaattoorrss. This is the only his- + tory expansion that does not begin with the history expansion charac- + ter. + + EEvveenntt DDeessiiggnnaattoorrss + An event designator is a reference to an entry in the history list. + The event designator consists of the portion of the word beginning with + the history expansion character and ending with the word designator if + present, or the end of the word. 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 bbllaannkk, + newline, carriage return, =, or (. + !!_n Refer to history list entry _n. + !!--_n Refer to the current entry minus _n. + !!!! Refer to the previous entry. This is a synonym for "!-1". + !!_s_t_r_i_n_g 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- + in the history list starting with _s_t_r_i_n_g. + !!??_s_t_r_i_n_g[[??]] + Refer to the most recent command preceding the current position + in the history list containing _s_t_r_i_n_g. The trailing ?? may be + omitted if _s_t_r_i_n_g is followed immediately by a newline. If + _s_t_r_i_n_g is missing, this uses the string from the most recent + search; it is an error if there is no previous search string. + ^^_s_t_r_i_n_g_1^^_s_t_r_i_n_g_2^^ + Quick substitution. Repeat the previous command, replacing + _s_t_r_i_n_g_1 with _s_t_r_i_n_g_2. Equivalent to "!!:s^_s_t_r_i_n_g_1^_s_t_r_i_n_g_2^" + (see MMooddiiffiieerrss below). + !!## The entire command line typed so far. + + WWoorrdd DDeessiiggnnaattoorrss + Word designators are used to select desired words from the event. They + are optional; if the word designator isn't supplied, the history expan- + sion uses the entire 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 in- + serted into the current line separated by single spaces. + + 00 ((zzeerroo)) + The zeroth word. For the shell, and many other applications, + this is the command word. + _n The _nth word. + ^^ The first argument: word 1. + $$ The last word. This is usually the last argument, but expands + to the zeroth word if there is only one word in the line. + %% The first word matched by the most recent "?_s_t_r_i_n_g?" search, if + the search string begins with a character that is part of a + word. By default, searches begin at the end of each line and + proceed to the beginning, so the first word matched is the one + closest to the end of the line. + _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; it expands to the empty string in that case. + xx** Abbreviates _x_-_$. + xx-- Abbreviates _x_-_$ like xx**, but omits the last word. If xx 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 + previous command is used as the event, equivalent to !!!!. + + MMooddiiffiieerrss + After the optional word designator, the expansion may include a se- + quence of one or more of the following modifiers, each preceded by a + ":". These modify, or edit, the word or words selected from the his- + tory event. + + hh Remove a trailing filename component, leaving only the head. + tt Remove all leading filename components, leaving the tail. + rr Remove a trailing suffix of the form _._x_x_x, leaving the basename. + ee Remove all but the trailing suffix. + pp Print the new command but do not execute it. + qq Quote the substituted words, escaping further substitutions. + xx Quote the substituted words as with qq, but break into words at + bbllaannkkss and newlines. The qq and xx modifiers are mutually exclu- + sive; expansion uses the last one supplied. + ss//_o_l_d//_n_e_w// + Substitute _n_e_w for the first occurrence of _o_l_d 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 event line. A single backslash quotes the delimiter in _o_l_d + and _n_e_w. If & appears in _n_e_w, it is replaced with _o_l_d. A sin- + gle backslash quotes the &. If _o_l_d is null, it is set to the + last _o_l_d substituted, or, if no previous history substitutions + took place, the last _s_t_r_i_n_g in a !!??_s_t_r_i_n_g[[??]] search. If _n_e_w is + null, each matching _o_l_d is deleted. + && Repeat the previous substitution. + gg Cause changes to be applied over the entire event line. This is + used in conjunction with "::ss" (e.g., "::ggss//_o_l_d//_n_e_w//") or "::&&". + If used with "::ss", 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 + the event line. An aa may be used as a synonym for gg. + GG Apply the following "ss" 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- +PPRROOGGRRAAMMMMIINNGG WWIITTHH HHIISSTTOORRYY FFUUNNCCTTIIOONNSS + 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- + IInnttrroodduuccttiioonn ttoo HHiissttoorryy + 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 _e_x_p_a_n_s_i_o_n function is avail- able which provides for a consistent user interface across different programs. @@ -142,24 +170,24 @@ HISTORY(3) Library Functions Manual HISTORY(3) 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. + history substitution provided by bbaasshh. - The programmer can also use the readline library, which includes some + 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 + file _<_r_e_a_d_l_i_n_e_/_h_i_s_t_o_r_y_._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. - History Storage + HHiissttoorryy SSttoorraaggee The history list is an array of history entries. A history entry is declared as follows: - typedef void * histdata_t; + _t_y_p_e_d_e_f _v_o_i_d _* hhiissttddaattaa__tt;; typedef struct _hist_entry { char *line; @@ -169,7 +197,7 @@ HISTORY(3) Library Functions Manual HISTORY(3) The history list itself might therefore be declared as - HIST_ENTRY ** the_history_list; + _H_I_S_T___E_N_T_R_Y _*_* tthhee__hhiissttoorryy__lliisstt;; The state of the History library is encapsulated into a single struc- ture: @@ -178,328 +206,330 @@ HISTORY(3) Library Functions Manual HISTORY(3) * 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. */ + HIST_ENTRY **entries; /* Pointer to entry records. */ + int offset; /* The current record. */ + int length; /* Number of records in list. */ + int size; /* Number of records allocated. */ int flags; } HISTORY_STATE; - If the flags member includes HS_STIFLED, the history has been stifled. + If the flags member includes HHSS__SSTTIIFFLLEEDD, the history has been stifled. -History Functions +HHiissttoorryy FFuunnccttiioonnss This section describes the calling sequence for the various functions exported by the GNU History library. - Initializing History and State Management + IInniittiiaalliizziinngg HHiissttoorryy aanndd SSttaattee MMaannaaggeemmeenntt 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 + _v_o_i_d uussiinngg__hhiissttoorryy (_v_o_i_d) + Begin a session in which the history functions might be used. This initializes the interactive variables. - HISTORY_STATE * history_get_history_state (void) + _H_I_S_T_O_R_Y___S_T_A_T_E _* hhiissttoorryy__ggeett__hhiissttoorryy__ssttaattee (_v_o_i_d) 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. + _v_o_i_d hhiissttoorryy__sseett__hhiissttoorryy__ssttaattee (_H_I_S_T_O_R_Y___S_T_A_T_E _*_s_t_a_t_e) + Set the state of the history list according to _s_t_a_t_e. - - History List Management - These functions manage individual entries on the history list, or set + HHiissttoorryy LLiisstt MMaannaaggeemmeenntt + 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 + _v_o_i_d aadddd__hhiissttoorryy (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) + Place _s_t_r_i_n_g at the end of the history list. The associated data field + (if any) is set to NNUULLLL. If the maximum number of history entries has + been set using ssttiiffllee__hhiissttoorryy(()), and the new number of history entries would exceed that maximum, the oldest history entry is removed. - void add_history_time (const char *string) + _v_o_i_d aadddd__hhiissttoorryy__ttiimmee (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) Change the time stamp associated with the most recent history entry to - string. + _s_t_r_i_n_g. - HIST_ENTRY * remove_history (int which) - Remove history entry at offset which from the history. The removed el- + _H_I_S_T___E_N_T_R_Y _* rreemmoovvee__hhiissttoorryy (_i_n_t _w_h_i_c_h) + Remove history entry at offset _w_h_i_c_h 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 + _h_i_s_t_d_a_t_a___t ffrreeee__hhiissttoorryy__eennttrryy (_H_I_S_T___E_N_T_R_Y _*_h_i_s_t_e_n_t) + Free the history entry _h_i_s_t_e_n_t 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- + _H_I_S_T___E_N_T_R_Y _* rreeppllaaccee__hhiissttoorryy__eennttrryy (_i_n_t _w_h_i_c_h_, _c_o_n_s_t _c_h_a_r _*_l_i_n_e_, _h_i_s_t_- + _d_a_t_a___t _d_a_t_a) + Make the history entry at offset _w_h_i_c_h have _l_i_n_e and _d_a_t_a. This re- + turns the old entry so the caller can dispose of any application-spe- + cific data. In the case of an invalid _w_h_i_c_h, a NNUULLLL pointer is re- turned. - void clear_history (void) + _v_o_i_d cclleeaarr__hhiissttoorryy (_v_o_i_d) 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. + _v_o_i_d ssttiiffllee__hhiissttoorryy (_i_n_t _m_a_x) + Stifle the history list, remembering only the last _m_a_x entries. The + history list will contain only _m_a_x 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 + _i_n_t uunnssttiiffllee__hhiissttoorryy (_v_o_i_d) + Stop stifling the history. This returns the previously-set maximum + number of history entries (as set by ssttiiffllee__hhiissttoorryy(())). history was stifled. The value is positive if the history was stifled, negative if it wasn't. - int history_is_stifled (void) + _i_n_t hhiissttoorryy__iiss__ssttiifflleedd (_v_o_i_d) Returns non-zero if the history is stifled, zero if it is not. - - Information About the History List + IInnffoorrmmaattiioonn AAbboouutt tthhee HHiissttoorryy LLiisstt 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- + _H_I_S_T___E_N_T_R_Y _*_* hhiissttoorryy__lliisstt (_v_o_i_d) + Return a NNUULLLL terminated array of _H_I_S_T___E_N_T_R_Y _* which is the current in- put history. Element 0 of this list is the beginning of time. If - there is no history, return NULL. + there is no history, return NNUULLLL. - int where_history (void) + _i_n_t wwhheerree__hhiissttoorryy (_v_o_i_d) Returns the offset of the current history element. - HIST_ENTRY * current_history (void) + _H_I_S_T___E_N_T_R_Y _* ccuurrrreenntt__hhiissttoorryy (_v_o_i_d) Return the history entry at the current position, as determined by - where_history(). If there is no entry there, return a NULL pointer. + wwhheerree__hhiissttoorryy(()). If there is no entry there, return a NNUULLLL 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. + _H_I_S_T___E_N_T_R_Y _* hhiissttoorryy__ggeett (_i_n_t _o_f_f_s_e_t) + Return the history entry at position _o_f_f_s_e_t. The range of valid values + of _o_f_f_s_e_t starts at hhiissttoorryy__bbaassee and ends at hhiissttoorryy__lleennggtthh - 1. If + there is no entry there, or if _o_f_f_s_e_t is outside the valid range, re- + turn a NNUULLLL pointer. - time_t history_get_time (HIST_ENTRY *) - Return the time stamp associated with the history entry passed as the + _t_i_m_e___t hhiissttoorryy__ggeett__ttiimmee (_H_I_S_T___E_N_T_R_Y _*) + 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 + _i_n_t hhiissttoorryy__ttoottaall__bbyytteess (_v_o_i_d) + 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 + MMoovviinngg AArroouunndd tthhee HHiissttoorryy LLiisstt 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 + _i_n_t hhiissttoorryy__sseett__ppooss (_i_n_t _p_o_s) + Set the current history offset to _p_o_s, an absolute index into the list. + Returns 1 on success, 0 if _p_o_s 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. + _H_I_S_T___E_N_T_R_Y _* pprreevviioouuss__hhiissttoorryy (_v_o_i_d) + 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 NNUULLLL 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 + _H_I_S_T___E_N_T_R_Y _* nneexxtt__hhiissttoorryy (_v_o_i_d) + 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. - + otherwise, return a NNUULLLL pointer. - Searching the History List + SSeeaarrcchhiinngg tthhee HHiissttoorryy LLiisstt 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- + backward from the current history position. The search may be _a_n_- + _c_h_o_r_e_d, 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 + _i_n_t hhiissttoorryy__sseeaarrcchh (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _d_i_r_e_c_t_i_o_n) + Search the history for _s_t_r_i_n_g, starting at the current history offset. + If _d_i_r_e_c_t_i_o_n is less than 0, then the search is through previous en- + tries, otherwise through subsequent entries. If _s_t_r_i_n_g 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. + returned is the offset in the line of the entry where _s_t_r_i_n_g was found. + Otherwise, nothing is changed, and the function returns -1. + + _i_n_t hhiissttoorryy__sseeaarrcchh__pprreeffiixx (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _d_i_r_e_c_t_i_o_n) + Search the history for _s_t_r_i_n_g, starting at the current history offset. + The search is anchored: matching lines must begin with _s_t_r_i_n_g. If _d_i_- + _r_e_c_t_i_o_n is less than 0, then the search is through previous entries, + otherwise through subsequent entries. If _s_t_r_i_n_g is found, then the + current history index is set to that entry, and the return value is 0. + Otherwise, nothing is changed, and the function returns -1. + + _i_n_t hhiissttoorryy__sseeaarrcchh__ppooss (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _d_i_r_e_c_t_i_o_n_, _i_n_t _p_o_s) + Search for _s_t_r_i_n_g in the history list, starting at _p_o_s, an absolute in- + dex into the list. If _d_i_r_e_c_t_i_o_n is negative, the search proceeds back- + ward from _p_o_s, otherwise forward. Returns the absolute index of the + history element where _s_t_r_i_n_g was found, or -1 otherwise. + + MMaannaaggiinngg tthhee HHiissttoorryy FFiillee + 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 + _i_n_t rreeaadd__hhiissttoorryy (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e) + Add the contents of _f_i_l_e_n_a_m_e to the history list, a line at a time. If + _f_i_l_e_n_a_m_e is NNUULLLL, then read from _~_/_._h_i_s_t_o_r_y. Returns 0 if successful, + or eerrrrnnoo if not. + + _i_n_t rreeaadd__hhiissttoorryy__rraannggee (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e_, _i_n_t _f_r_o_m_, _i_n_t _t_o) + Read a range of lines from _f_i_l_e_n_a_m_e, adding them to the history list. + Start reading at line _f_r_o_m and end at _t_o. If _f_r_o_m is zero, start at + the beginning. If _t_o is less than _f_r_o_m, then read until the end of the + file. If _f_i_l_e_n_a_m_e is NNUULLLL, then read from _~_/_._h_i_s_t_o_r_y. Returns 0 if + successful, or eerrrrnnoo if not. + + _i_n_t wwrriittee__hhiissttoorryy (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e) + Write the current history to _f_i_l_e_n_a_m_e, overwriting _f_i_l_e_n_a_m_e if neces- + sary. If _f_i_l_e_n_a_m_e is NNUULLLL, then write the history list to _~_/_._h_i_s_t_o_r_y. + Returns 0 on success, or eerrrrnnoo on a read or write error. + + _i_n_t aappppeenndd__hhiissttoorryy (_i_n_t _n_e_l_e_m_e_n_t_s_, _c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e) + Append the last _n_e_l_e_m_e_n_t_s of the history list to _f_i_l_e_n_a_m_e. If _f_i_l_e_n_a_m_e + is NNUULLLL, then append to _~_/_._h_i_s_t_o_r_y. Returns 0 on success, or eerrrrnnoo 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. + _i_n_t hhiissttoorryy__ttrruunnccaattee__ffiillee (_c_o_n_s_t _c_h_a_r _*_f_i_l_e_n_a_m_e_, _i_n_t _n_l_i_n_e_s) + Truncate the history file _f_i_l_e_n_a_m_e, leaving only the last _n_l_i_n_e_s lines. + If _f_i_l_e_n_a_m_e is NNUULLLL, then _~_/_._h_i_s_t_o_r_y is truncated. Returns 0 on suc- + cess, or eerrrrnnoo on failure. - - History Expansion + HHiissttoorryy EExxppaannssiioonn These functions implement history expansion. - int history_expand (char *string, char **output) - Expand string, placing the result into output, a pointer to a string. + _i_n_t hhiissttoorryy__eexxppaanndd (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _c_h_a_r _*_*_o_u_t_p_u_t) + Expand _s_t_r_i_n_g, placing the result into _o_u_t_p_u_t, 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 + 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 + 2 if the returned line should be displayed, but not exe- + cuted, as with the ::pp modifier. + If an error occurred in expansion, then _o_u_t_p_u_t 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. + _c_h_a_r _* ggeett__hhiissttoorryy__eevveenntt (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g_, _i_n_t _*_c_i_n_d_e_x_, _i_n_t _q_c_h_a_r) + Returns the text of the history event beginning at _s_t_r_i_n_g + _*_c_i_n_d_e_x. + _*_c_i_n_d_e_x is modified to point to after the event specifier. At function + entry, _c_i_n_d_e_x points to the index into _s_t_r_i_n_g where the history event + specification begins. _q_c_h_a_r is a character that is allowed to end the + event specification in addition to the "normal" terminating characters. - 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(). + _c_h_a_r _*_* hhiissttoorryy__ttookkeenniizzee (_c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) + Return an array of tokens parsed out of _s_t_r_i_n_g, much as the shell + might. The tokens are split on the characters in the hhiissttoorryy__wwoorrdd__ddee-- + lliimmiitteerrss variable, and shell quoting conventions are obeyed. + _c_h_a_r _* hhiissttoorryy__aarrgg__eexxttrraacctt (_i_n_t _f_i_r_s_t_, _i_n_t _l_a_s_t_, _c_o_n_s_t _c_h_a_r _*_s_t_r_i_n_g) + Extract a string segment consisting of the _f_i_r_s_t through _l_a_s_t arguments + present in _s_t_r_i_n_g. Arguments are split using hhiissttoorryy__ttookkeenniizzee(()). - History Variables + HHiissttoorryy VVaarriiaabblleess This section describes the externally-visible variables exported by the GNU History Library. - int history_base + _i_n_t hhiissttoorryy__bbaassee The logical offset of the first entry in the history list. - int history_length + _i_n_t hhiissttoorryy__lleennggtthh 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(). + _i_n_t hhiissttoorryy__mmaaxx__eennttrriieess + The maximum number of history entries. This must be changed using ssttii-- + ffllee__hhiissttoorryy(()). - int history_write_timestamps + _i_n_t hhiissttoorryy__wwrriittee__ttiimmeessttaammppss 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. + _h_i_s_t_o_r_y___c_o_m_m_e_n_t___c_h_a_r to delimit timestamp entries in the history file. + If that variable does not have a value (the default), the history li- + brary will not write timestamps. - char history_expansion_char - The character that introduces a history event. The default is !. Set- + _c_h_a_r hhiissttoorryy__eexxppaannssiioonn__cchhaarr + The character that introduces a history event. The default is !!. Set- ting this to 0 inhibits history expansion. - char history_subst_char + _c_h_a_r hhiissttoorryy__ssuubbsstt__cchhaarr The character that invokes word substitution if found at the start of a - line. The default is ^. + line. The default is ^^. - char history_comment_char + _c_h_a_r hhiissttoorryy__ccoommmmeenntt__cchhaarr 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()<>;&|". + _c_h_a_r _* hhiissttoorryy__wwoorrdd__ddeelliimmiitteerrss + The characters that separate tokens for hhiissttoorryy__ttookkeenniizzee(()). The de- + fault value is "" \\tt\\nn(())<<>>;;&&||"". - char * history_no_expand_chars + _c_h_a_r _* hhiissttoorryy__nnoo__eexxppaanndd__cchhaarrss The list of characters which inhibit history expansion if found immedi- - ately following history_expansion_char. The default is space, tab, - newline, \r, and =. + ately following hhiissttoorryy__eexxppaannssiioonn__cchhaarr. The default is space, tab, + newline, \\rr, 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 + _c_h_a_r _* hhiissttoorryy__sseeaarrcchh__ddeelliimmiitteerr__cchhaarrss + 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 + _i_n_t hhiissttoorryy__qquuootteess__iinnhhiibbiitt__eexxppaannssiioonn + 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 his- + tory expansion performed, since single quotes are not special within + double quotes. The default value is 0. + + _i_n_t hhiissttoorryy__qquuoottiinngg__ssttaattee + An application may set this variable to indicate that the current line + being expanded is subject to existing quoting. If set to _', history + expansion assumes that the line is single-quoted and inhibit expansion + until it reads an unquoted closing single quote; if set to _", history + expansion assumes the line is double quoted until it reads an unquoted + closing double quote. If set to zero, the default, history expansion + assumes the line is not quoted and treats quote characters within the + line as described above. This is only effective if hhiissttoorryy__qquuootteess__iinn-- + hhiibbiitt__eexxppaannssiioonn is set. + + _r_l___l_i_n_e_b_u_f___f_u_n_c___t _* hhiissttoorryy__iinnhhiibbiitt__eexxppaannssiioonn__ffuunnccttiioonn + This should be set to the address of a function that takes two argu- + ments: a cchhaarr ** (_s_t_r_i_n_g) and an iinntt index into that string (_i). It + should return a non-zero value if the history expansion starting at + _s_t_r_i_n_g_[_i_] should not be performed; zero if the expansion should be + done. It is intended for use by applications like bbaasshh that use the + history expansion character for additional purposes. By default, this + variable is set to NNUULLLL. + +FFIILLEESS + _~_/_._h_i_s_t_o_r_y 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) +SSEEEE AALLSSOO + _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey + _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey + _b_a_s_h(1) + _r_e_a_d_l_i_n_e(3) -AUTHORS +AAUUTTHHOORRSS 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. +BBUUGG RREEPPOORRTTSS + If you find a bug in the hhiissttoorryy 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 hhiissttoorryy 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. + Once you have determined that a bug actually exists, mail a bug report + to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g. If you have a fix, you are welcome to mail + that as well! Suggestions and "philosophical" bug reports may be + mailed to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g or posted to the Usenet newsgroup + ggnnuu..bbaasshh..bbuugg. Comments and bug reports concerning this manual page should be directed - to chet.ramey@case.edu. - - + to _c_h_e_t_._r_a_m_e_y_@_c_a_s_e_._e_d_u. -GNU History 8.1 2020 July 17 HISTORY(3) +GNU History 8.3 2024 December 31 _H_I_S_T_O_R_Y(3) diff --git a/doc/history.3 b/doc/history.3 index 06419cf..53be120 100644 --- a/doc/history.3 +++ b/doc/history.3 @@ -6,29 +6,68 @@ .\" Case Western Reserve University .\" chet.ramey@case.edu .\" -.\" Last Change: Fri Jul 17 09:43:01 EDT 2020 +.\" Last Change: Tue Dec 31 13:35:52 EST 2024 .\" -.TH HISTORY 3 "2020 July 17" "GNU History 8.1" +.TH HISTORY 3 "2024 December 31" "GNU History 8.3" .\" +.ie \n(.g \{\ +.ds ' \(aq +.ds " \(dq +.ds ^ \(ha +.ds ~ \(ti +.\} +.el \{\ +.ds ' ' +.\" \*" is not usable in macro arguments on AT&T troff (DWB, Solaris 10) +.ds " ""\" two adjacent quotes and no space before this comment +.ds ^ ^ +.ds ~ ~ +.\} +. +.\" Fix broken EX/EE macros on DWB troff. +.\" Detect it: only DWB sets up a `)Y` register. +.if \n(.g .nr )Y 0 \" silence "groff -wreg" warning +.if \n()Y \{\ +.\" Revert the undesired changes to indentation. +.am EX +.in -5n +.. +.am EE +.in +5n +.. +.\} +. .\" File Name macro. This used to be `.PN', for Path Name, .\" but Sun doesn't seem to like that very much. +.\" \% at the beginning of the string protects the filename from hyphenation. .\" .de FN -\fI\|\\$1\|\fP +\%\fI\|\\$1\|\fP +.. +.\" +.\" Quotation macro: generate consistent quoted strings that don't rely +.\" on the presence of the `CW' constant-width font. +.\" +.de Q +.ie \n(.g \(lq\\$1\(rq\\$2 +.el \{\ +. if t ``\\$1''\\$2 +. if n "\\$1"\\$2 +.\} .. .ds lp \fR\|(\fP .ds rp \fR\|)\fP .\" FnN return-value fun-name N arguments -.de Fn1 +.de F1 \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3\fP\\*(rp .br .. -.de Fn2 +.de F2 .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 +.de F3 .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 @@ -40,18 +79,26 @@ .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. +.if t The GNU History Library is Copyright \(co 1989-2025 by the Free Software Foundation, Inc. +.if n The GNU History Library is Copyright (C) 1989-2025 by the Free Software Foundation, Inc. .SH DESCRIPTION -Many programs read input from the user a line at a time. The GNU +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. +data with each line, and utilize information from previous lines when +composing new ones. .PP +The History library provides functions that allow applications to their +\fIhistory\fP, the set of previously-typed lines, +which it keeps in a list. +Applications can choose which lines to save into a history list, how +many commands to save, save a history list to a file, read a history +list from a file, and display lines from the history in various +formats. .SH "HISTORY EXPANSION" The history library supports a history expansion feature that is identical to the history expansion in -.BR bash. +.BR bash . This section describes what syntax features are available. .PP History expansions introduce words from the history list into @@ -62,25 +109,46 @@ 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 +The first is to determine which history list entry to use during substitution. -The second is to select portions of that line for inclusion into +The second is to select portions of that entry to include 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. +.PP +The entry selected from the history is the \fIevent\fP, +and the portions of that entry 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 +The entry is split into words in the same fashion as \fBbash\fP does when reading input, -so that several words that would otherwise be separated +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). +The \fIevent designator\fP selects the event, the optional +\fIword designator\fP selects words from the event, and +various optional \fImodifiers\fP are available to manipulate the +selected words. +.PP History expansions are introduced by the appearance of the history expansion character, which is \^\fB!\fP\^ by default. +History expansions may appear anywhere in the input, but do not nest. +.PP Only backslash (\^\fB\e\fP\^) and single quotes can quote the history expansion character. +.PP +There is a special abbreviation for substitution, active when the +\fIquick substitution\fP character (default \fB\*^\fP) +is the first character on the line. +It selects the previous history list entry, using an event designator +equivalent to \fB!!\fP, +and substitutes one string for another in that entry. +It is described below under \fBEvent Designators\fP. +This is the only history expansion that does not begin with the history +expansion character. .SS Event Designators -An event designator is a reference to a command line entry in the -history list. +An event designator is a reference to an entry in the history list. +The event designator +consists of the portion of the word beginning with the history +expansion character and ending with the word designator if present, +or the end of the word. Unless the reference is absolute, events are relative to the current position in the history list. .PP @@ -89,43 +157,48 @@ position in the history list. .B ! Start a history substitution, except when followed by a .BR blank , -newline, = or (. +newline, carriage return, =, +or (. .TP -.B !\fIn\fR -Refer to command line +.B !\fIn\fP +Refer to history list entry .IR n . .TP -.B !\-\fIn\fR -Refer to the current command minus +.B !\-\fIn\fP +Refer to the current entry minus .IR n . .TP .B !! -Refer to the previous command. This is a synonym for `!\-1'. +Refer to the previous entry. +This is a synonym for +.Q !\-1 . .TP -.B !\fIstring\fR -Refer to the most recent command -preceding the current position in the history list -starting with +.B !\fIstring\fP +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 +.B !?\fIstring\fR\fB[?]\fP +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; +If \fIstring\fP is missing, this uses +the string from the most recent search; 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 +.B \d\s+2\*^\s-2\u\fIstring1\fP\d\s+2\*^\s-2\u\fIstring2\fP\d\s+2\*^\s-2\u +.\" was .B \*^\fIstring1\fP\*^\fIstring2\fP\*^ +Quick substitution. +Repeat the previous 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'' +.Q !!:s\d\s+2\*^\s-2\u\fIstring1\fP\d\s+2\*^\s-2\u\fIstring2\fP\d\s+2\*^\s-2\u +.\" was .Q !!:s\*^\fIstring1\fP\*^\fIstring2\fP\*^ (see \fBModifiers\fP below). .TP .B !# @@ -133,11 +206,13 @@ The entire command line typed so far. .PD .SS Word Designators Word designators are used to select desired words from the event. +They are optional; if the word designator isn't supplied, the history +expansion uses the entire 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 * , .BR \- , @@ -150,32 +225,43 @@ Words are inserted into the current line separated by single spaces. .PD 0 .TP .B 0 (zero) -The zeroth word. For the shell, this is the command -word. +The zeroth word. +For the shell, and many other applications, this is the command word. .TP .I n -The \fIn\fRth word. +The \fIn\fPth word. .TP -.B ^ -The first argument. That is, word 1. +.B \*^ +The first argument: word 1. .TP .B $ -The last word. This is usually the last argument, but will expand to the +The last word. +This is usually the last argument, but expands 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, +The first word matched by the most recent +.Q ?\fIstring\fP? +search, if the search string begins with a character that is part of a word. +By default, searches begin at the end of each line and proceed to the +beginning, so the first word matched is the one closest to the end of +the line. .TP .I x\fB\-\fPy -A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'. +A range of words; +.Q \-\fIy\fP +abbreviates +.Q 0\-\fIy\fP . .TP .B * -All of the words but the zeroth. This is a synonym -for `\fI1\-$\fP'. It is not an error to use +All of the words but the zeroth. +This is a synonym for +.Q \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. +if there is just one word in the event; +it expands to the empty string in that case. .TP .B x* Abbreviates \fIx\-$\fP. @@ -186,20 +272,20 @@ 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. +previous command is used as the event, equivalent to \fB!!\fP. .SS Modifiers -After the optional word designator, there may appear a sequence of -one or more of the following modifiers, each preceded by a `:'. +After the optional word designator, the expansion may include a +sequence of one or more of the following modifiers, each preceded by a +.Q : . 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. +Remove a trailing filename component, leaving only the head. .TP .B t -Remove all leading file name components, leaving the tail. +Remove all leading filename components, leaving the tail. .TP .B r Remove a trailing suffix of the form \fI.xxx\fP, leaving the @@ -220,8 +306,8 @@ Quote the substituted words as with 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. +The \fBq\fP and \fBx\fP modifiers are mutually exclusive; +expansion uses the last one supplied. .TP .B s/\fIold\fP/\fInew\fP/ Substitute @@ -232,15 +318,15 @@ 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 +A single backslash quotes the delimiter in .I old and -.I new -with a single backslash. If & appears in +.IR new . +If & appears in .IR new , -it is replaced by +it is replaced with .IR old . -A single backslash will quote the &. +A single backslash quotes the &. If .I old is null, it is set to the last @@ -249,7 +335,7 @@ substituted, or, if no previous history substitutions took place, the last .I string in a -.B !?\fIstring\fR\fB[?]\fR +.B !?\fIstring\fP[?] search. If .I new @@ -261,21 +347,30 @@ is deleted. 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 +Cause changes to be applied over the entire event line. +This is used in conjunction with +.Q \fB:s\fP +(e.g., +.Q \fB:gs/\fIold\fP/\fInew\fP/\fR ) +or +.Q \fB:&\fP . +If used with +.Q \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. +Apply the following +.Q \fBs\fP +or +.Q \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 +.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 @@ -310,11 +405,13 @@ declared as follows: .Vb "typedef void *" histdata_t; .PP .nf +.EX typedef struct _hist_entry { char *line; char *timestamp; histdata_t data; } HIST_ENTRY; +.EE .fi .PP The history list itself might therefore be declared as @@ -324,16 +421,18 @@ The history list itself might therefore be declared as The state of the History library is encapsulated into a single structure: .PP .nf +.EX /* * 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. */ + HIST_ENTRY **entries; /* Pointer to entry records. */ + int offset; /* The current record. */ + int length; /* Number of records in list. */ + int size; /* Number of records allocated. */ int flags; } HISTORY_STATE; +.EE .fi .PP If the flags member includes \fBHS_STIFLED\fP, the history has been @@ -345,192 +444,182 @@ exported by the GNU History library. 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 +.PP +.F1 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 +.PP +.F1 "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" +.PP +.F1 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" +.PP +.F1 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" +.PP +.F1 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" +.PP +.F1 "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" +.PP +.F1 "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" +.PP +.F3 "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" +.PP +.F1 void clear_history "void" Clear the history list by deleting all the entries. - -.Fn1 void stifle_history "int max" +.PP +.F1 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" +.PP +.F1 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 +history was stifled. +The value is positive if the history was stifled, negative if it wasn't. - -.Fn1 int history_is_stifled "void" +.PP +.F1 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" +.PP +.F1 "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" +.PP +.F1 int where_history "void" Returns the offset of the current history element. - -.Fn1 "HIST_ENTRY *" current_history "void" +.PP +.F1 "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" +.PP +.F1 "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 *" +.PP +.F1 "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" +.PP +.F1 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" +.PP +.F1 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" +.PP +.F1 "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" +.PP +.F1 "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" +.PP +.F2 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" +\fIstring\fP was found. +Otherwise, nothing is changed, and the function returns \-1. +.PP +.F2 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" +current history index is set to that entry, and the return value is 0. +Otherwise, nothing is changed, and the function returns \-1. +.PP +.F3 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. - +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" +.PP +.F1 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. +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" +.PP +.F3 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, +\fBNULL\fP, then read from \fI\*~/.history\fP. Returns 0 if successful, or \fBerrno\fP if not. - -.Fn1 int write_history "const char *filename" +.PP +.F1 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. +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" +.PP +.F2 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. +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" +.PP +.F2 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. +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" +.PP +.F2 int history_expand "const char *string" "char **output" Expand \fIstring\fP, placing the result into \fIoutput\fP, a pointer to a string. Returns: .RS @@ -544,7 +633,7 @@ character); 1 if expansions did take place; .TP --1 +\-1 if there was an error in expansion; .TP 2 @@ -554,82 +643,103 @@ as with the \fB:p\fP modifier. .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" +.PP +.F3 "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" +to the +.Q normal +terminating characters. +.PP +.F1 "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" +.PP +.F3 "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. - +.PP .Vb int history_base The logical offset of the first entry in the history list. - +.PP .Vb int history_length The number of entries currently stored in the history list. - +.PP .Vb int history_max_entries The maximum number of history entries. This must be changed using \fBstifle_history()\fP. - +.PP .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. - +to delimit timestamp entries in the history file. +If that variable does +not have a value (the default), +the history library will not write timestamps. +.PP .Vb char history_expansion_char -The character that introduces a history event. The default is \fB!\fP. +The character that introduces a history event. +The default is \fB!\fP. Setting this to 0 inhibits history expansion. - +.PP .Vb char history_subst_char The character that invokes word substitution if found at the start of -a line. The default is \fB^\fP. - +a line. +The default is \fB\*^\fP. +.PP .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. - +.PP .Vb "char *" history_word_delimiters The characters that separate tokens for \fBhistory_tokenize()\fP. -The default value is \fB"\ \et\en()<>;&|"\fP. - +The default value is \fB\*"\ \et\en()<>;&|\*"\fP. +.PP .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. - +.PP .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. - +.PP .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. - +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. +.PP +.Vb 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 \fI\*'\fP, +history expansion assumes that the line is single-quoted and +inhibit expansion until it reads an unquoted closing single quote; +if set to \fI\*"\fP, history expansion assumes the line is double quoted +until it reads an unquoted closing double quote. +If set to zero, the default, +history expansion assumes the line is not quoted and +treats quote characters within the line as described above. +This is only effective if \fBhistory_quotes_inhibit_expansion\fP is set. +.PP .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) @@ -641,9 +751,9 @@ 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 +.PD 0 .TP -.FN ~/.history +.FN \*~/.history Default filename for reading and writing saved history .PD .SH "SEE ALSO" @@ -677,8 +787,10 @@ library that you have. 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 +as well! Suggestions and +.Q philosophical +bug reports may be mailed +to \fIbug\-readline\fP@\fIgnu.org\fP or posted to the Usenet newsgroup .BR gnu.bash.bug . .PP diff --git a/doc/history.dvi b/doc/history.dvi index bf33fe4..1cdf806 100644 Binary files a/doc/history.dvi and b/doc/history.dvi differ diff --git a/doc/history.html b/doc/history.html index 3c258f4..62803d8 100644 --- a/doc/history.html +++ b/doc/history.html @@ -1,14 +1,14 @@ - + - + @@ -54,7 +52,6 @@ ul.no-bullet {list-style: none} -

GNU History Library

@@ -64,12 +61,12 @@ ul.no-bullet {list-style: none} -
-
+
+ -

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 @@ -78,27 +75,27 @@ typed input. -

+
-
-
+
+ -

1 Using History Interactively

+

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

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

    - +

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

    The History library +provides a history expansion feature that is similar +to the history expansion provided by csh +(also referred to as history substitution where appropriate). +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 takes place in two parts. +The first is to determine +which entry from the history list should be used during substitution. +The second is to select portions of that entry to include into the +current one. +

    +

    The entry selected from the history is called the event, +and the portions of that entry that are acted upon are words. +Various modifiers are available to manipulate the selected words. +The entry is split into words in the same fashion that Bash +does when reading input, +so that several words surrounded by quotes are considered one word. +The event designator selects the event, the optional +word designator selects words from the event, and +various optional modifiers are available to manipulate the +selected words. +

    +

    History expansions are introduced by the appearance of the +history expansion character, which is ‘!’ by default. +History expansions may appear anywhere in the input, but do not nest.

    History expansion implements shell-like quoting conventions: a backslash can be used to remove the special handling for the next character; @@ -176,70 +187,85 @@ but single quotes may not, since they are not treated specially within double quotes.

    +

    There is a special abbreviation for substitution, active when the +quick substitution character +(default ‘^’) +is the first character on the line. +It selects the previous history list entry, using an event designator +equivalent to !!, +and substitutes one string for another in that entry. +It is described below (see Event Designators). +This is the only history expansion that does not begin with the history +expansion character. +

    -
      +
      -
      -
      +
      + -

      1.1.1 Event Designators

      - +

      1.1.1 Event Designators

      + -

      An event designator is a reference to a command line entry in the -history list. +

      An event designator is a reference to an entry in the history list. +The event designator consists of the portion of the word beginning +with the history expansion character, and ending with the word designator +if one is present, or the end of the word. 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 ‘=’. +the end of the line, or ‘=’.

      -
      !n
      -

      Refer to command line n. +

      !n
      +

      Refer to history list entry n.

      -
      !-n
      -

      Refer to the command n lines back. +

      !-n
      +

      Refer to the history entry minus n.

      -
      !!
      -

      Refer to the previous command. This is a synonym for ‘!-1’. +

      !!
      +

      Refer to the previous entry. +This is a synonym for ‘!-1’.

      -
      !string
      +
      !string

      Refer to the most recent command preceding the current position in the history list -starting with string. +starting with string.

      -
      !?string[?]
      +
      !?string[?]

      Refer to the most recent command preceding the current position in the history list -containing string. +containing string. The trailing -‘?’ may be omitted if the string is followed immediately by +‘?’ 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; +If string is missing, this uses +the string from the most recent search; 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^. +

      ^string1^string2^
      +

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

      -
      !#
      +
      !#

      The entire command line typed so far.

      @@ -247,154 +273,167 @@ with string2. Equivalent to
      -
      -
      +
      + -

      1.1.2 Word Designators

      +

      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. +They are optional; if the word designator isn’t supplied, the history +expansion uses the entire 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). +That first word is usually the command word, and the arguments begin +with the second word. +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 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 !$. +

      !!:$
      +

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

      -
      !fi:2
      +
      !fi:2

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

      Here are the word designators: -

      -
      -
      0 (zero)
      -

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

      +
      +
      0 (zero)
      +

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

      -
      n
      -

      The nth word. +

      n
      +

      The nth word.

      -
      ^
      -

      The first argument; that is, word 1. +

      ^
      +

      The first argument: word 1.

      -
      $
      -

      The last argument. +

      $
      +

      The last word. +This is usually the last argument, but expands to the +zeroth word if there is only one word in the line.

      -
      %
      -

      The first word matched by the most recent ‘?string?’ search, +

      %
      +

      The first word matched by the most recent ‘?string?’ search, if the search string begins with a character that is part of a word. +By default, searches begin at the end of each line and proceed to the +beginning, so the first word matched is the one closest to the end of +the line.

      -
      x-y
      -

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

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

      *
      +

      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; +it expands to the empty string in that case.

      -
      x*
      -

      Abbreviates ‘x-$’ +

      x*
      +

      Abbreviates ‘x-$’.

      -
      x-
      -

      Abbreviates ‘x-$’ like ‘x*’, but omits the last word. -If ‘x’ is missing, it defaults to 0. +

      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. +previous command is used as the event, equivalent to !!.


      -
      -
      +
      + -

      1.1.3 Modifiers

      +

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

      +
      h
      +

      Remove a trailing filename component, leaving only the head.

      -
      t
      -

      Remove all leading pathname components, leaving the tail. +

      t
      +

      Remove all leading filename components, leaving the tail.

      -
      r
      -

      Remove a trailing suffix of the form ‘.suffix’, leaving +

      r
      +

      Remove a trailing suffix of the form ‘.suffix’, leaving the basename.

      -
      e
      +
      e

      Remove all but the trailing suffix.

      -
      p
      +
      p

      Print the new command but do not execute it.

      -
      s/old/new/
      -

      Substitute new for the first occurrence of old in the +

      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 +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 with old. +A single backslash quotes the ‘&’ in old and new. +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[?] +the last string +in a !?string[?] search. -If new is null, each matching old is deleted. +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
      +
      a
      +

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

      -
      G
      -

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

      G
      +

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

      @@ -404,20 +443,21 @@ in the event.
      -
      -
      +
      + -

      2 Programming with GNU History

      +

      2 Programming with GNU History

      This chapter describes how to interface programs that you write -with the GNU History Library. +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. +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 +

        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 when composing new ones. +

        +

        A programmer using the History library can use functions +to save commands on a history list, +associate arbitrary data with history list entries, +remove entries from the list, +search through the list for a line containing an arbitrary text string, +reference any entry in the list directly, +and read and write the history list from and to a file. +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 +

        Someone 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. +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 @@ -457,25 +501,26 @@ 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. +the file <readline/history.h> in any file that uses the +History library’s features. +It supplies declarations for all of the library’s +public functions and variables, +and declares all of the public data structures.


        -
        -
        +
        + -

        2.2 History Storage

        +

        2.2 History Storage

        -

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

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

        -
        typedef void *histdata_t;
        +
        typedef void *histdata_t;
         
         typedef struct _hist_entry {
           char *line;
        @@ -487,13 +532,13 @@ typedef struct _hist_entry {
         

        The history list itself might therefore be declared as

        -
        HIST_ENTRY **the_history_list;
        +
        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 {
        @@ -505,23 +550,23 @@ typedef struct _hist_state {
         } HISTORY_STATE;
         
        -

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

        If the flags member includes HS_STIFLED, the history has been +stifled (limited to a maximum number of entries).


        -
        -
        +
        + -

        2.3 History Functions

        +

        2.3 History Functions

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

        -
          +
          -
          -
          +
          + -

          2.3.1 Initializing History and State Management

          +

          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: void using_history (void)
          +

          Begin a session that will use the history functions. +This initializes the interactive variables.

          -
          -
          Function: HISTORY_STATE * history_get_history_state (void)
          +
          +
          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. +

          +
          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

          +

          2.3.2 History List Management

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

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

          Place string at the end of the history list. The associated data -field (if any) is set to NULL. +

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

          Add string to the end of the history list, and +set the associated data field (if any) 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. +stifle_history(), and the new number of history entries +would exceed that maximum, this removes the oldest history entry.

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

          Change the time stamp associated with the most recent history entry to -string. +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, +

          +
          Function: HIST_ENTRY * remove_history (int which)
          +

          Remove the history entry at offset which from the history list. +This returns the removed element so you can free the line, data, and containing structure. +Since the data is private to your application, the History library +doesn’t know how to free it, if necessary.

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

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

          +
          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. +application-specific data. +In the case of an invalid which, this returns NULL.

          -
          -
          Function: void clear_history (void)
          +
          +
          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: 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 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)
          +
          +
          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

          +

          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: 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. +Return NULL if there is no history.

          -
          -
          Function: int where_history (void)
          -

          Returns the offset of the current history element. +

          +
          Function: int where_history (void)
          +

          Return the offset of the current history entry.

          -
          -
          Function: HIST_ENTRY * current_history (void)
          +
          +
          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. +where_history(). +If there is no entry there, return NULL.

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

          Return the history entry at position offset. +

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

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

          Return the time stamp associated with the history entry entry. +

          +
          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)
          +
          +
          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. @@ -687,284 +736,311 @@ history.


          -
          -
          +
          + -

          2.3.4 Moving Around the History List

          +

          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 +

          +
          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 +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)
          +
          +
          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. +return a pointer to that entry. +If there is no previous entry, return NULL.

          -
          -
          Function: HIST_ENTRY * next_history (void)
          +
          +
          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. +otherwise, return NULL.


          -
          -
          +
          + -

          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 +

          2.3.5 Searching the History List

          + + +

          These functions search 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 a 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. +If string is found, then the current history index is set to +that history entry, and history_search +returns the offset in the line of the entry where +string was found. +Otherwise, nothing is changed, and this returns -1.

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

          +
          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 history entries 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. +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 this returns -1.

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

          +
          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 index in the history list +of the history element where string was +found, or -1 otherwise.


          -
          -
          +
          + -

          2.3.6 Managing the History File

          +

          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 (const char *filename)
          +

          Add the contents of filename to the history list, one entry +at a time. +If filename is NULL, this reads from ~/.history, +if it exists. +This attempts to determine whether the history file includes timestamp +information, and assigns timestamps to the history entries it reads +if so. +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 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, this reads until the end of the file. +This attempts to determine whether the history file includes timestamp +information, and assigns timestamps to the history entries it reads +if so. +If filename is NULL, this reads from ~/.history, +if it exists. +Returns 0 if successful, or errno if not.

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

          Write the current history to filename, overwriting filename +

          +
          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. +This writes timestamp information if the +history_write_timestamps variable is set to a non-zero value. +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 append_history (int nelements, const char *filename)
          +

          Append the last nelements of the history list to filename. +This writes timestamp information if the +history_write_timestamps variable is set to a non-zero value. +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. +

          +
          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, this truncates ~/.history. +Returns 0 on success, or errno on failure.


          -
          -
          +
          + -

          2.3.7 History Expansion

          +

          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
          +
          +
          Function: int history_expand (const 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
          +
          1

          if expansions did take place;

          -
          -1
          +
          -1

          if there was an error in expansion;

          -
          2
          +
          2

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

          -

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

          If an error occurred during 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 +

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

          Returns the text of the history event beginning at string + +*cindex. +Modifies *cindex 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, +

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

          +
          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. +This splits string into arguments using history_tokenize.


          -
          -
          +
          + -

          2.4 History Variables

          +

          2.4 History Variables

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

          -
          -
          Variable: int history_base
          +
          +
          Variable: int history_base

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

          -
          -
          Variable: int history_length
          +
          +
          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_max_entries
          +

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

          -
          -
          Variable: int history_write_timestamps
          +
          +
          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. +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. +

          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), +the history library will not write timestamps.

          -
          -
          Variable: char history_expansion_char
          -

          The character that introduces a history event. The default is ‘!’. +

          +
          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
          +
          +
          Variable: char history_subst_char

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

          -
          -
          Variable: char history_comment_char
          -

          During tokenization, if this character is seen as the first character +

          +
          Variable: char history_comment_char
          +

          During tokenization, if this character appears 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_word_delimiters
          +

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

          -
          -
          Variable: char * history_search_delimiter_chars
          +
          +
          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. +string, in addition to space, TAB, ‘:’ and ‘?’ in the case of +a substring search. +The default is empty.

          -
          -
          Variable: char * history_no_expand_chars
          +
          +
          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 ‘=’. +following history_expansion_char. +The default is space, tab, newline, carriage return, and ‘=’.

          -
          -
          Variable: int history_quotes_inhibit_expansion
          +
          +
          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 @@ -973,50 +1049,54 @@ within double quotes. The default value is 0.

          -
          -
          Variable: int history_quoting_state
          +
          +
          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. +being expanded is subject to existing quoting. +If set to ‘'’, +history expansion assumes that the line is single-quoted and +inhibit expansion until it reads an unquoted closing single quote; +if set to ‘"’, +history expansion assumes the line is double quoted +until it reads an unquoted closing double quote. +If set to 0, the default, +history expansion assumes the line is not quoted and +treats quote characters within the line as described above. +This is only effective if history_quotes_inhibit_expansion is set. +This is intended for use by applications like Bash which allow +quoted strings to span multiple lines.

          -
          -
          Variable: rl_linebuf_func_t * history_inhibit_expansion_function
          +
          +
          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). +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 +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. +By default, this variable is set to NULL.


          -
          -
          +
          + -

          2.5 History Programming Example

          +

          2.5 History Programming Example

          -

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

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

          -
          -
          #include <stdio.h>
          +
          +
          #include <stdio.h>
           #include <readline/history.h>
           
          -main (argc, argv)
          -     int argc;
          -     char **argv;
          +int
          +main (int argc, char **argv)
           {
             char line[1024], *t;
             int len, done = 0;
          @@ -1101,29 +1181,29 @@ main (argc, argv)
           
          -
          -
          +
          + -

          Appendix A GNU Free Documentation License

          +

          Appendix A GNU Free Documentation License

          -
          Version 1.3, 3 November 2008 +
          Version 1.3, 3 November 2008
          -
          Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
          -http://fsf.org/
          +
          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 +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 @@ -1197,16 +1277,16 @@ 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 +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, @@ -1295,7 +1375,7 @@ 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 @@ -1495,7 +1575,7 @@ not give you any rights to use it. 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/. +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 @@ -1541,30 +1621,30 @@ provided the MMC is eligible for relicensing.

                -

                ADDENDUM: How to use this License for your documents

                +

                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.
                +
                +
                  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.
          -
          +
          +
              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 @@ -1579,168 +1659,172 @@ to permit their use in free software.


          -
          -
          +
          + -

          Appendix B Concept Index

          -
          Jump to:   A +

          Appendix B Concept Index

          +
          +
          Jump to:   A   -E +E   -H +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

          + + + + + + + + + + + + +
          Index EntrySection

          A
          anchored searchSearching the History List

          E
          event designatorsEvent Designators

          H
          history eventsEvent Designators
          history expansionHistory Interaction
          History SearchingSearching the History List

          -
          Jump to:   A + +
          -
          -
          +
          + -

          Appendix C Function and Variable Index

          -
          Jump to:   A +

          Appendix C Function and Variable Index

          +
          +
          Jump to:   A   -C +C   -F +F   -G +G   -H +H   -N +N   -P +P   -R +R   -S +S   -U +U   -W +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

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Index EntrySection

          A
          add_historyHistory List Management
          add_history_timeHistory List Management
          append_historyManaging the History File

          C
          clear_historyHistory List Management
          current_historyInformation About the History List

          F
          free_history_entryHistory List Management

          G
          get_history_eventHistory Expansion

          H
          history_arg_extractHistory Expansion
          history_baseHistory Variables
          history_comment_charHistory Variables
          history_expandHistory Expansion
          history_expansion_charHistory Variables
          history_getInformation About the History List
          history_get_history_stateInitializing History and State Management
          history_get_timeInformation About the History List
          history_inhibit_expansion_functionHistory Variables
          history_is_stifledHistory List Management
          history_lengthHistory Variables
          history_listInformation About the History List
          history_max_entriesHistory Variables
          history_no_expand_charsHistory Variables
          history_quotes_inhibit_expansionHistory Variables
          history_quoting_stateHistory Variables
          history_searchSearching the History List
          history_search_delimiter_charsHistory Variables
          history_search_posSearching the History List
          history_search_prefixSearching the History List
          history_set_history_stateInitializing History and State Management
          history_set_posMoving Around the History List
          history_subst_charHistory Variables
          history_tokenizeHistory Expansion
          history_total_bytesInformation About the History List
          history_truncate_fileManaging the History File
          history_word_delimitersHistory Variables
          history_write_timestampsHistory Variables

          N
          next_historyMoving Around the History List

          P
          previous_historyMoving Around the History List

          R
          read_historyManaging the History File
          read_history_rangeManaging the History File
          remove_historyHistory List Management
          replace_history_entryHistory List Management

          S
          stifle_historyHistory List Management

          U
          unstifle_historyHistory List Management
          using_historyInitializing History and State Management

          W
          where_historyInformation About the History List
          write_historyManaging the History File

          -
          Jump to:   A + + diff --git a/doc/history.info b/doc/history.info index a6799c3..3663d06 100644 --- a/doc/history.info +++ b/doc/history.info @@ -1,11 +1,11 @@ -This is history.info, produced by makeinfo version 6.8 from +This is history.info, produced by makeinfo version 7.1 from history.texi. -This document describes the GNU History library (version 8.2, 19 -September 2022), a programming tool that provides a consistent user +This document describes the GNU History library (version 8.3, 30 +December 2024), a programming tool that provides a consistent user interface for recalling lines of previously typed input. - Copyright (C) 1988-2022 Free Software Foundation, Inc. + Copyright © 1988-2025 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, @@ -60,8 +60,9 @@ File: history.info, Node: History Interaction, Up: Using History Interactively ===================== 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. +to the history expansion provided by ‘csh’ (also referred to as history +substitution where appropriate). 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 @@ -69,15 +70,22 @@ 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. +determine which entry from the history list should be used during +substitution. The second is to select portions of that entry to include +into the current one. + + The entry selected from the history is called the “event”, and the +portions of that entry that are acted upon are “words”. Various +“modifiers” are available to manipulate the selected words. The entry +is split into words in the same fashion that Bash does when reading +input, so that several words surrounded by quotes are considered one +word. The “event designator” selects the event, the optional “word +designator” selects words from the event, and various optional +“modifiers” are available to manipulate the selected words. + + History expansions are introduced by the appearance of the history +expansion character, which is ‘!’ by default. History expansions may +appear anywhere in the input, but do not nest. History expansion implements shell-like quoting conventions: a backslash can be used to remove the special handling for the next @@ -87,6 +95,14 @@ 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. + There is a special abbreviation for substitution, active when the +QUICK SUBSTITUTION character (default ‘^’) is the first character on the +line. It selects the previous history list entry, using an event +designator equivalent to ‘!!’, and substitutes one string for another in +that entry. It is described below (*note Event Designators::). This is +the only history expansion that does not begin with the history +expansion character. + * Menu: * Event Designators:: How to specify which history line to use. @@ -99,39 +115,41 @@ File: history.info, Node: Event Designators, Next: Word Designators, Up: Hist 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. +An event designator is a reference to an entry in the history list. The +event designator consists of the portion of the word beginning with the +history expansion character, and ending with the word designator if one +is present, or the end of the word. 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 '='. + the end of the line, or ‘=’. -'!N' - Refer to command line N. +‘!N’ + Refer to history list entry N. -'!-N' - Refer to the command N lines back. +‘!-N’ + Refer to the history entry minus N. -'!!' - Refer to the previous command. This is a synonym for '!-1'. +‘!!’ + Refer to the previous entry. This is a synonym for ‘!-1’. -'!STRING' +‘!STRING’ Refer to the most recent command preceding the current position in the history list starting with STRING. -'!?STRING[?]' +‘!?STRING[?]’ Refer to the most recent command preceding the current position in - the history list containing STRING. The trailing '?' may be + 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. + STRING is missing, this uses the string from the most recent + search; it is an error if there is no previous search string. -'^STRING1^STRING2^' +‘^STRING1^STRING2^’ Quick Substitution. Repeat the last command, replacing STRING1 - with STRING2. Equivalent to '!!:s^STRING1^STRING2^'. + with STRING2. Equivalent to ‘!!:s^STRING1^STRING2^’. -'!#' +‘!#’ The entire command line typed so far.  @@ -140,62 +158,70 @@ File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Desi 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 +Word designators are used to select desired words from the event. They +are optional; if the word designator isn't supplied, the history +expansion uses the entire 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). That first word is usually the command word, and the arguments +begin with the second word. 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 '!$'. +‘!!:$’ + designates the last word of the preceding command. This may be + shortened to ‘!$’. -'!fi:2' +‘!fi:2’ designates the second argument of the most recent command starting - with the letters 'fi'. + with the letters ‘fi’. Here are the word designators: -'0 (zero)' - The '0'th word. For many applications, this is the command word. +‘0 (zero)’ + The ‘0’th word. For the shell, and many other, applications, this + is the command word. -'N' +‘N’ The Nth word. -'^' - The first argument; that is, word 1. +‘^’ + The first argument: word 1. -'$' - The last argument. +‘$’ + The last word. This is usually the last argument, but expands 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. +‘%’ + The first word matched by the most recent ‘?STRING?’ search, if the + search string begins with a character that is part of a word. By + default, searches begin at the end of each line and proceed to the + beginning, so the first word matched is the one closest to the end + of the line. -'X-Y' - A range of words; '-Y' abbreviates '0-Y'. +‘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. +‘*’ + 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; it expands to the empty string in that case. -'X*' - Abbreviates 'X-$' +‘X*’ + Abbreviates ‘X-$’. -'X-' - Abbreviates 'X-$' like 'X*', but omits the last word. If 'x' is +‘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. +previous command is used as the event, equivalent to ‘!!’.  File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction @@ -204,46 +230,46 @@ File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Inte --------------- After the optional word designator, you can add a sequence of one or -more of the following modifiers, each preceded by a ':'. These modify, +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. +‘h’ + Remove a trailing filename component, leaving only the head. -'t' - Remove all leading pathname components, leaving the tail. +‘t’ + Remove all leading filename components, leaving the tail. -'r' - Remove a trailing suffix of the form '.SUFFIX', leaving the +‘r’ + Remove a trailing suffix of the form ‘.SUFFIX’, leaving the basename. -'e' +‘e’ Remove all but the trailing suffix. -'p' +‘p’ Print the new command but do not execute it. -'s/OLD/NEW/' +‘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 + 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. - -'&' + ‘&’ appears in NEW, it is replaced with OLD. A single backslash + quotes the ‘&’ in OLD and NEW. 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’ +‘a’ + Cause changes to be applied over the entire event line. This is + 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 +‘G’ + Apply the following ‘s’ or ‘&’ modifier once to each word in the event.  @@ -262,7 +288,7 @@ Interactively::. * 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 Variables:: Variables that control behavior. * History Programming Example:: Example of using the GNU History Library.  @@ -274,21 +300,21 @@ File: history.info, Node: Introduction to History, Next: History Storage, Up: 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. +lines when 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. + A programmer using the History library can use functions to save +commands on a history list, associate arbitrary data with history list +entries, remove entries from the list, search through the list for a +line containing an arbitrary text string, reference any entry in the +list directly, and read and write the history list from and to a file. +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 + Someone 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'. +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 @@ -296,10 +322,9 @@ 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 ‘’ in any file that uses the History library's +features. It supplies 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 @@ -336,8 +361,8 @@ structure: int flags; } HISTORY_STATE; - If the flags member includes 'HS_STIFLED', the history has been -stifled. + If the flags member includes ‘HS_STIFLED’, the history has been +stifled (limited to a maximum number of entries).  File: history.info, Node: History Functions, Next: History Variables, Prev: History Storage, Up: Programming with GNU History @@ -377,7 +402,7 @@ 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 + Begin a session that will use the history functions. This initializes the interactive variables. -- Function: HISTORY_STATE * history_get_history_state (void) @@ -397,20 +422,22 @@ 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. + Add STRING to the end of the history list, and set the associated + data field (if any) 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, this removes the + oldest history entry. -- 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. + Remove the history entry at offset WHICH from the history list. + This returns the removed element so you can free the line, data, + and containing structure. Since the data is private to your + application, the History library doesn't know how to free it, if + necessary. -- Function: histdata_t free_history_entry (HIST_ENTRY *histent) Free the history entry HISTENT and any history library private data @@ -421,8 +448,8 @@ parameters managing the list itself. *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. + application-specific data. In the case of an invalid WHICH, this + returns ‘NULL’. -- Function: void clear_history (void) Clear the history list by deleting all the entries. @@ -433,7 +460,7 @@ parameters managing the list itself. -- 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 + number of history entries (as set by ‘stifle_history()’). The value is positive if the history was stifled, negative if it wasn't. @@ -450,24 +477,23 @@ 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 + 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'. + time. Return ‘NULL’ if there is no history. -- Function: int where_history (void) - Returns the offset of the current history element. + Return the offset of the current history entry. -- 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. + ‘where_history()’. If there is no entry there, return ‘NULL’. -- 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 + 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. + entry there, or if OFFSET is outside the valid range, return + ‘NULL’. -- Function: time_t history_get_time (HIST_ENTRY *entry) Return the time stamp associated with the history entry ENTRY. If @@ -495,13 +521,13 @@ or changed. -- 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. + return ‘NULL’. -- 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. + that entry; otherwise, return ‘NULL’.  File: history.info, Node: Searching the History List, Next: Managing the History File, Prev: Moving Around the History List, Up: History Functions @@ -509,37 +535,37 @@ File: history.info, Node: Searching the History List, Next: Managing the Histo 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. +These functions search 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 a 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. + entry, and ‘history_search’ returns the offset in the line of the + entry where STRING was found. Otherwise, nothing is changed, and + this returns -1. -- 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. + offset. The search is anchored: matching history entries 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 this returns -1. -- 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. + backward from POS, otherwise forward. Returns the index in the + history list 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 @@ -551,34 +577,43 @@ 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. + Add the contents of FILENAME to the history list, one entry at a + time. If FILENAME is ‘NULL’, this reads from ‘~/.history’, if it + exists. This attempts to determine whether the history file + includes timestamp information, and assigns timestamps to the + history entries it reads if so. 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. + start at the beginning. If TO is less than FROM, this reads until + the end of the file. This attempts to determine whether the + history file includes timestamp information, and assigns timestamps + to the history entries it reads if so. If FILENAME is ‘NULL’, this + reads from ‘~/.history’, if it exists. 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. + necessary. This writes timestamp information if the + ‘history_write_timestamps’ variable is set to a non-zero value. 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. + Append the last NELEMENTS of the history list to FILENAME. This + writes timestamp information if the ‘history_write_timestamps’ + variable is set to a non-zero value. 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. + lines. If FILENAME is ‘NULL’, this truncates ‘~/.history’. + Returns 0 on success, or ‘errno’ on failure.  File: history.info, Node: History Expansion, Prev: Managing the History File, Up: History Functions @@ -588,32 +623,32 @@ File: history.info, Node: History Expansion, Prev: Managing the History File, These functions implement history expansion. - -- Function: int history_expand (char *string, char **output) + -- Function: int history_expand (const char *string, char **output) Expand STRING, placing the result into OUTPUT, a pointer to a string (*note History Interaction::). Returns: - '0' + ‘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' + ‘1’ if expansions did take place; - '-1' + ‘-1’ if there was an error in expansion; - '2' + ‘2’ if the returned line should be displayed, but not executed, as - with the ':p' modifier (*note Modifiers::). + with the ‘:p’ modifier (*note Modifiers::). - If an error occurred in expansion, then OUTPUT contains a + If an error occurred during 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. + *CINDEX. Modifies *CINDEX 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 @@ -624,8 +659,8 @@ These functions implement history expansion. -- 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'. + arguments present in STRING. This splits STRING into arguments + using ‘history_tokenize’.  File: history.info, Node: History Variables, Next: History Programming Example, Prev: History Functions, Up: Programming with GNU History @@ -644,7 +679,7 @@ GNU History Library. -- Variable: int history_max_entries The maximum number of history entries. This must be changed using - 'stifle_history()'. + ‘stifle_history()’. -- Variable: int history_write_timestamps If non-zero, timestamps are written to the history file, so they @@ -653,36 +688,36 @@ GNU History Library. 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. + does not have a value (the default), the history library will not + write timestamps. -- Variable: char history_expansion_char - The character that introduces a history event. The default is '!'. + 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 '^'. + of a line. The default is ‘^’. -- Variable: char history_comment_char - During tokenization, if this character is seen as the first + During tokenization, if this character appears 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()<>;&|"'. + 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 + 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 '='. + space, tab, newline, carriage return, and ‘=’. -- Variable: int history_quotes_inhibit_expansion If non-zero, the history expansion code implements shell-like @@ -694,24 +729,25 @@ GNU History Library. -- 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. + line being expanded is subject to existing quoting. If set to ‘'’, + history expansion assumes that the line is single-quoted and + inhibit expansion until it reads an unquoted closing single quote; + if set to ‘"’, history expansion assumes the line is double quoted + until it reads an unquoted closing double quote. If set to 0, the + default, history expansion assumes the line is not quoted and + treats quote characters within the line as described above. This + is only effective if HISTORY_QUOTES_INHIBIT_EXPANSION is set. This + is intended for use by applications like Bash which allow quoted + strings to span multiple lines. -- 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 + 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'. + purposes. By default, this variable is set to ‘NULL’.  File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History @@ -725,9 +761,8 @@ Library. #include #include - main (argc, argv) - int argc; - char **argv; + int + main (int argc, char **argv) { char line[1024], *t; int len, done = 0; @@ -816,7 +851,7 @@ Appendix A GNU Free Documentation License Version 1.3, 3 November 2008 - Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies @@ -825,7 +860,7 @@ Appendix A GNU Free Documentation License 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 + 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 @@ -1302,7 +1337,7 @@ Appendix B Concept Index * anchored search: Searching the History List. (line 10) * event designators: Event Designators. (line 6) -* history events: Event Designators. (line 8) +* history events: Event Designators. (line 10) * history expansion: History Interaction. (line 6) * History Searching: Searching the History List. (line 6) @@ -1321,13 +1356,13 @@ Appendix C Function and Variable Index * add_history_time: History List Management. (line 16) * append_history: Managing the History File. - (line 28) + (line 35) * clear_history: History List Management. - (line 37) + (line 39) * current_history: Information About the History List. (line 17) * free_history_entry: History List Management. - (line 25) + (line 27) * get_history_event: History Expansion. (line 26) * history_arg_extract: History Expansion. (line 41) * history_base: History Variables. (line 9) @@ -1335,14 +1370,14 @@ Appendix C Function and Variable Index * history_expand: History Expansion. (line 8) * history_expansion_char: History Variables. (line 29) * history_get: Information About the History List. - (line 22) + (line 21) * 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) + (line 28) +* history_inhibit_expansion_function: History Variables. (line 78) * history_is_stifled: History List Management. - (line 50) + (line 52) * history_length: History Variables. (line 12) * history_list: Information About the History List. (line 9) @@ -1351,12 +1386,12 @@ Appendix C Function and Variable Index * history_quotes_inhibit_expansion: History Variables. (line 57) * history_quoting_state: History Variables. (line 65) * history_search: Searching the History List. - (line 12) + (line 11) * history_search_delimiter_chars: History Variables. (line 47) * history_search_pos: Searching the History List. - (line 31) + (line 30) * history_search_prefix: Searching the History List. - (line 21) + (line 20) * history_set_history_state: Initializing History and State Management. (line 18) * history_set_pos: Moving Around the History List. @@ -1364,9 +1399,9 @@ Appendix C Function and Variable Index * history_subst_char: History Variables. (line 33) * history_tokenize: History Expansion. (line 35) * history_total_bytes: Information About the History List. - (line 33) + (line 32) * history_truncate_file: Managing the History File. - (line 33) + (line 42) * history_word_delimiters: History Variables. (line 43) * history_write_timestamps: History Variables. (line 19) * next_history: Moving Around the History List. @@ -1376,47 +1411,47 @@ Appendix C Function and Variable Index * read_history: Managing the History File. (line 9) * read_history_range: Managing the History File. - (line 14) + (line 17) * remove_history: History List Management. (line 20) * replace_history_entry: History List Management. - (line 30) + (line 32) * stifle_history: History List Management. - (line 40) + (line 42) * unstifle_history: History List Management. - (line 44) + (line 46) * 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) + (line 28)  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 +Node: Top848 +Node: Using History Interactively1493 +Node: History Interaction2001 +Node: Event Designators4715 +Node: Word Designators6217 +Node: Modifiers8612 +Node: Programming with GNU History10259 +Node: Introduction to History11002 +Node: History Storage12734 +Node: History Functions13914 +Node: Initializing History and State Management14903 +Node: History List Management15706 +Node: Information About the History List18137 +Node: Moving Around the History List19750 +Node: Searching the History List20830 +Node: Managing the History File22776 +Node: History Expansion25246 +Node: History Variables27219 +Node: History Programming Example31334 +Node: GNU Free Documentation License33988 +Node: Concept Index59163 +Node: Function and Variable Index59868  End Tag Table diff --git a/doc/history.pdf b/doc/history.pdf index 0732585..c85ebef 100644 Binary files a/doc/history.pdf and b/doc/history.pdf differ diff --git a/doc/history.ps b/doc/history.ps index 3776eab..c34cb77 100644 --- a/doc/history.ps +++ b/doc/history.ps @@ -1,18 +1,18 @@ %!PS-Adobe-2.0 -%%Creator: dvips(k) 2022.1 (TeX Live 2022) Copyright 2022 Radical Eye Software +%%Creator: dvips(k) 2024.1 (TeX Live 2024) Copyright 2024 Radical Eye Software %%Title: history.dvi -%%CreationDate: Tue Sep 20 14:17:06 2022 -%%Pages: 24 +%%CreationDate: Wed Jun 25 20:09:16 2025 +%%Pages: 25 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 -%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMCSC10 CMSL10 CMSLTT10 +%%DocumentFonts: CMR10 CMBX12 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 +%DVIPSSource: TeX output 2025.03.31:1028 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -1085,49 +1085,51 @@ DC17E6EF8DEEBDABCD84172AEAE450A585EA54FFCABB66E652B885000A457D7D cleartomark {restore}if %%EndFont -%%BeginFont: CMR10 -%!PS-AdobeFont-1.0: CMR10 003.002 -%%Title: CMR10 +%%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 CMR10. +%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/CMR10 known{/CMR10 findfont dup/UniqueID known{dup -/UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse +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 /CMR10 def -/FontBBox {-40 -250 1009 750 }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 CMR10.) readonly def -/FullName (CMR10) 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 false 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 11 /ff put -dup 12 /fi put -dup 13 /fl put -dup 14 /ffi put dup 33 /exclam put -dup 34 /quotedblright 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 @@ -1137,14 +1139,12 @@ 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 60 /less put +dup 61 /equal put +dup 62 /greater put dup 65 /A put dup 66 /B put dup 67 /C put @@ -1154,26 +1154,19 @@ 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 92 /backslash put dup 93 /bracketright put +dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put @@ -1184,7 +1177,6 @@ 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 @@ -1201,870 +1193,9 @@ 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 +dup 123 /braceleft put +dup 124 /bar put +dup 125 /braceright put readonly def currentdict end currentfile eexec @@ -2659,6 +1790,7 @@ 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 @@ -2857,284 +1989,294 @@ F44580845F0FA422868CFCC8029513235C0286B76196E350498845EA934DF289 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 +2F2CF263C941F6D5BC6524B34672AA2E8F514803C1E8F55F2FCAB120298DC137 +431DFDAF370FBC83A23575A6579B29525D8BF0CC2AE0812E43BD6B5BC69540B2 +5088418937AAC195F0783FFD2BB3CE3C30667D26D416BB3E656EBE8C7F03EBAA +ADE01A21A0CCFA5AB8092737602739EBAA82AFC3506EDAFB0FB23DBF2518FE65 +7A2F3183416F0DADB058DECDC88B67FED4C606DEE67F7B20627A60CEFD6D247C +B45103F2A1F501B0975EAFF78A14AF74706C690795ADD723B440BBBA2BEE3DF6 +F9DB670C8592B2D55B5C9AAD4C98971F0BB8BF23D5EE9C3EA8AF1E1F8B1FE6B7 +5733603870C63C668D33FD66EB454921BD87A36BF21F6EA50F645309598F9A69 +BE403C51346A68C26B7A90533A1B54CB5CA33635308BE80E66DCBF679353C8B7 +B0F1B866D0638FD94EB0AB92020966A51BFC6BFA0FB1C4AEF975E1F034C54D4F +8186D2D6EA376758E3D9D0FBF6467E7D9A8BA2A1B404196514D687268F3EB325 +F223E60F2BB410D7D9A5882CC1ED8E73023426B6D339A174264647887E9FCCFD +44412756145226164EA5ED5B30818F17B7D86D4D6F2D1CFF6746034995DDFA6F +E185C74C4ACDA520446A14207A0334ACAB47E9E630B7F81D1088A502D8DEC537 +96D2902BA91E80C0BF60472411C584229B98CFEEE4747607E329C22E58701441 +186D4A5E5B31E3EC43BEF15137DEC88BD2C72D3AE066988079E9AF997FE66AC5 +DA922ECFFEC6813881363A7C98EA2FDF7DC976E8441A441C27D92EBE8FFBC28E +2AEB583BC4301D237013846FF4F1F6B5EBF72D6C6D889ECE9F55C625EFCEA99D +17290CE3303CC7661C822B972DC863AE61F0B3A73D656235F2B9B370B6FC1CD7 +2C51C8A34746868A81A595D785439151A528790CC6516FCF6C0F792E5CB451C3 +59AC12FF2367F9ABBCF6A0CA61CB50E0BEC451D74FD11A3EB97930B90E45D5D1 +931DB7614A8EC569F988C0F324123A4797646FD995A93CA3724E5A30192DEBD7 +A3F32D71F34DE70DF335EB29962C4E6EB065AC59E265D9198551AB627578A883 +11C644B2F7A4FE253385AE904F36CFAFCC09515E6026695656B097EF53A714CB +6D67ACE27D86EA29528031104BC0C7C657E3A189614C4C71CDB02AF8A3D1EE4A +8A882396A5A84E446BE3092C7C4C56A116A8C31874A63F1CCEB51CE7DB370979 +D18E1F9A8A2D809DA94F9069EFFA8CB9A58D45A6EB0E1C53443EC39A6180813F +DED570D79EE76A45019204250B5C7034A9E35D975DA24A139F190A7293FCDF2B +4262BF157059D1558E3AF6D710AC7121035998B6ECC0363B654422A3A68751BE +BF6862FF1A994A9ADA163D23F4ED2D7461F910F51CFD86FD471C752B686ACCB2 +083A6501514E4A9B7CA9EBDF434B47B8D164AAFEDAAEEDF82D500D41ACF6B47F +BDA773298C9FF511E8DE1A26E92A5607CFDD2A34CEA8551929CB4B6744882B09 +2ED6954069FB831AAA881B03476F369E00D8BC7292FADF493CAC21A878F8C167 +3BCE4BC24DC5C0A2B3213E10854F7D23BD05107C64BDB336F8878A571696FD3C +4A2E5418D59102D6F1D66E2FCD6B157586401D80ADE2CDE0796141C569120A68 +1AE2D0E06EEA6AEBAB56604CE46A5EB52C0B0F34EE7A1BC9E60B9B12071F1CF6 +7A23886A7B1A3933176B6D2F9F96B902DC900DC051B8C02A4C37DD5C2B0D32C7 +6936BD399B33BE511D16ED77CE8A973C0D7D9946F21336167484A7C8990F5AD3 +44E00963A8DDA72A35C4B017ED37A4D874B000649AE2AE9FC4265470A7DAE304 +99DCD05DCC2AB7A35FE07C1B50895028E45EF513CD43694E683827676A561C4A +B40F171DA97B93D735CC57FDFE23672132EFE594FC07968CFFD18056B46D37B3 +ACB4DD63AD987922E0CFAC1D88A283363E394B6F46C4E51BDEC9B55055E2918C +389D5DFA85741E2A1AFB3007DAB4AC711B18BB12E618E62B69F53944E5161864 +7A372245024254EAF66A0D2AB94DF1C7C0DEE22C6FA445085731347E480E7D0E +8D16B37757880E7B23A8F2D8CA3F1AA6D00D733ED5DF19B206C60B7680D2D423 +D445497B5FDDB06511533F88E686FD529A1A454AEF1844D67FCF08B4B1ED07C8 +2043A0D0A6935A232896F11AD08EAAEC6666BB828C6C2C208BE74B95F675A5FB +DF5A5AD3C90F096CEB6BEBAA82D56DB2096F3E3C778F173B19630681CFCE560D +C5AC8B35781D6F6DABD9ED6EF895AAEA7EC81EC327E4CB9E106EE07FFFD59019 +63B50155066DFFB53874D2A60F8F312FD68A43070954ACE11DF3D182D03D6784 +C5055498D670DBBDC35AABE825F605E82918D4992314D6D20E5FFB99A8755BBB +120BC62D8E168A08D79AC6AEABA87FE11DE5A83BD99A077518E6162036FA6381 +251EB7D94A61735DAE349E6363A9C30F2F399097BE0F684E1989333F8C88F304 +967DAACD36E7057FCADF61429C8260868AA786F92250CBE6F3D84766FC590267 +74EBAC7A909ECC8CFF68BE8BB4F697D86AAE5286A04D7B9FEA6812E682DFF090 +D43FC28ACE03B7D62EF750B442687F7F3257AD4CB1CAD613AD3D6A27B6444199 +1BEB37DC535DF91667B47182E0053C6560195D476AA2C370DCD0804EA85C457D +7A640C2E808B327CF62E6BAFB9A39660BE892F43F203331348361632CB0CF363 +16C587FD5F579B2A14A8E5D781DA5146B58E3DB9834EE1E0C172DDC00834C88C +D42F73672E67FC4418526E7430BE92D57F15247446DF6482CF0DAD40485521DF +3A4591743762B6C73051EC17164D0401D3517135E5B5E460F8614A1BD7A1C3E4 +CFCD9694FCFC3968676DEB42EB1987A489C711EA9ED493A20ACC389507F11E81 +FC931D4451EC5F897D159AE4D0E8B26AD1C64DCE2295C44AF44E57DE040D041C +A3D3B438C3C95B9213E1795AE52E605C693581A47D376EA6A0EA50F2B7F8093C +5950A8FF842225350BBAB27EF31AE5355D36DD07ACDC20776F4554A55558B784 +5C610C12055FAF049F8610655F5AC9A4D4E4D8D98F664325D90CB7B45C0C504A +96B1DD5EB57BF2E2CBF59A59145BB2A6CFC10448F98A6E31EFEDA339F125EC3E +05EE01B26AB28CD2096701F95BEEFA94D3C73598FC41A35FDEEC00A61DE9C3CD +B734BB2F977BE1E2A47196DD069A7CFDEE30E257CFCE90E5F31E2ED1AE832060 +B5DDBDD4F326B4498296399BD9504573788CCDA457CA814C026BD201B8FCDF6D +F938D66D68B489EF76B64BA853AC58122A0F1FFB4CBE1C6B30EEF44915B81EB4 +CF8F3B7F8EAC091A3652BD4013CF44AF62F9F5B9012487B4C549AFAF0463DA64 +5E5A2E29D7D2481179FFC83838727E0BF250178BBF8C26C5A6F5DE91CE52E36B +3A962587570EE36995C917287DAB4F10F086117C1A4D86DC83BEE163624EA023 +62E8584A47FB88ED06371F1AA5337BDAB4BD05194CBACE39A55AB4A130057264 +4284CA5CE508835E44D15FC40B551D4CD167A6781A5F5D784DE009C1883C9AF5 +007AFA69D819716C7929FEC1A0EFB64F872F9E683A89B4A7940380333353E36E +6B7CDD54534E034D8E2EE0134B81544892DC1C48001E5DB6CDDD7110B0AEEB90 +C91F1DF2E8C45A24685B6A46F3C61926EC51EBD4722993FC2572DB90CD753CE8 +22E3B93E8DE9FA444D0595180925EF6F4F889F31AF7EDE354AD2699543BBEE71 +797332A7A4F41382043E9FFE8B85998EA8AED71723859AF2970530DA6833159E +031482A238371811854BA394F90DE07241C1BBEBB55DC1441ABBC8524714E401 +49AD1E865799F93F4746A420195F681ABA9C761236C689154EA42F08776787E9 +440DA8E289A5C16DD637A71203E90CCB0A25791BDA7B12F2865AE7F436976550 +094B9D6F28C648041EDC5037840AB9DC00FA8C12000E78F636CC47E9A1AE0A19 +18061B6CF101E61AF8BFE4CB86D2EA0A07F870AA46EE945F814044A7D7AEB845 +BF84AC4712B0AF124730BDA95F46CE5663891C42B8899D4FBCFC1796D37F736E +406D0E27C3F088426FA2345EBFCB40378002D53B72CFE17AF0E3A7525BC89523 +D7106D711A6D2E18377C20FF9E6F4E23044B4CE9AF94B982D920C63D7DB86B09 +CF1AB5A77406A1E1518F40A1ACEFAC974E094B86D0D04FE5D7AD36DB6C42A9F7 +A2FA04B05DA0F2A6F5BC049C86C037C1E3095250F44D7783B11C1CC2D8D0DF15 +9E992B7C54863D709C6C8B4A9EA1E3697FB96FCC3AA52A4725BD821CF64D275F +9513276379CDE3CC80A917B83F955CCAC6B0CFD07534AD1A977AB61578A07BB1 +A0A106DF564A182F2291CE101A62FC5E2E7D94DD1B304909320EB07B30E3133C +3E1273EE0D1DA4F473EF9ECE97EFD485EE71F94A40C1210E8D095DA67D6C41AE +F68D519D151BF2AE17141077EAE0F8D5BCBC8AD1A65AF2204E7A477F5E10C5D0 +4F61F777175EE300340285CBF3FC164121AA430E24AE894B593D82765C33A050 +1C445E58B85BA3627457E3A197E94DC65E4C577B1A4FEFD78E33AA2AE7168C75 +BCA3387C3CDE43475F3F0D0798A543A34F0361B87E439B11E5D32EA52BDAFCE3 +C0AC9117D06AFE15374CB757F4F771336D985CF04BE834BA2E8092CBC640FB4F +78BAF4E81AE90661EACAE45A074F23DDFB3DB3E0D0D8F8D9EA929504193E7ABC +E413731FB7D0AEDCA0ABD5D951F5BEB901DC7F3CCD2D0E61B1D2A07B79071AA1 +61D5728F7865F34D6F30FBD4997A59BF993C8F7F6A4F0C4A515DE06C79425945 +98D7FCF7FE365C5656DF8C5FA1610660FDD6A19CE5982478F5453F1F1E079767 +727FEC7ACDBE50AEA9D05948804BE55FE0FC7F464A0BD1F099940C99E6ADC894 +C21B5672C7E50A440B388D5E4BB4E37976C5A1CA0399802F2EA7DAF60C61A6B8 +E279F842832B285BD0532412D8A1E272C0F64B2AE5D993428E36C4BF6ED24240 +467FF48457766C2F24CCA637C622B84C8B22308D5F4DA3A1C10C905FCB01DA2F +10D61FAA96622F03D5181850C1FD0209C6FA0951CFC38C67700F5AF1BBCAD623 +2E815110143D910C03E13643D9B287685AE13F4CAD0210896EC21F9791B3A313 +62F3A9E5E837D356E03EB26E0B58466760DA9287AFA33581927231965B76543B +BE7CBAE37C49ADD39692EA5A53939199B9ABFFDB0373A7B4D356A759B94C9D19 +9E6DF8AFFFEE69DD41D414DCDBA3C0C1548927C516BF025056930CA1EA7F12A9 +A42ED08324A53DCB96D043D3D6C71E49C140DA3C0EEEDBA89B4D1D20D0D4385F +17BCDE7660700CA6B95A3564A25E4274E59C72CE2CDB90B5306ADEA2768D5439 +52E1099A0957E41FAB5B65D0A70A457672BD7E3C2E00ECDA042D38D2398E3FB3 +66238157D749EFCA6BFAB70B0FFF39517049B3C508F6768F32C03DE2746D20A6 +FB7B039CD461207B1302BD71BD43F53768C564DB3F29A36447BE8F01F48AE503 +A6B9AE1AE673AE34C5A1C0E769495642C7AA2FA673FB741414E01EE2E8EBD04C +C1E0C7A875DE5BCB43A5588C7D4C64AC4EC028685D463A02A9F0606659F71898 +69272F6DAB3FDF573BC9833D055508BA1BEDA4D18452E95F2DC0138E4B96B54D +1892A69B2CBEFA8E3536DA3623FE9D23638CA5D656D007C43DBC3E022582D872 +FAAB422B7E834D0349ADA62E2D02467CCBFECF5B0B567D2610DBAD0E72BC4A9D +FB6B8E8BFDC60AFEB2AAD9D2971568AC5803F5CC487AF1125B9F918FE66B21FA +F20283F5FDA3FBD5C410283212D96BCD32FD6801B199BDDA5284ABA8424F5B71 +B4F48204FEE6E8E7BB1CB3A8901C747B6B7F169DEFF040FDCFF7BD950481EBDD +D26576055339E8E950874E08E49F8770E80B12942ED8B7B749626550C761DF70 +10284DF51E1BD4839A3238D60A4E981B1631F32D178838DEAA63E61BE1AE94DF +2989DB919CA4EE5E2EA5537323FBEC10E9D2E989DDAFECC37CB36B74E0393BAF +07ED8A19140C408BFACF41C0E2EC4982D32BCFB2671D36A1AD823BEF7DA8C97C +F553B680B797069D882AFBD0FDBB1BBC47B684B1582FE0D6C74E17ECCA4425F3 +7272D70973897879B7AD81966CD20BD13811E18F8706EA40E9DCE7D1788E0C16 +B56B72AD90F759AB9AEB4AD949E9588B452FEA29FCA2DA3C13E54EDFA9C6CE8E +65FA26D04133A56E85DC878923734478FFD08115C7061FAA277873DAA4D5026B +7DC761389538666C4ED3405B3FD657B7CE0534BABF6A3282B67B610C7CD46244 +AD3037AC1DEB04318861B64E681F355A123BB0ECD0AC34ABFE77C157354F7E22 +7FB4008BD6CFFC940392BC53FB751EC742A09B575FF0144AA758C29EAD8DF5FE +C14D9F32D0E26098B2268750028A5CB8773021DE6A53A71B1432903CFFF5834A +EA0596E85D11DB5B3581D6E990E2A97D6B5FB6DA2742230925083EA6A1151E6B +54C3A58253C4D27E9EA834F75860714087D03F06D022C1FCEAFEE102D755AB6A +CE0A5B64DD8499B0F8282237B52E2A8D3914EC53D471229C03ABCCF305F94BE7 +4B47DD210FEC8954C423937685B62CD589AFA801ECFACC8A47B46078D3C4CD6C +BF8632B90A006F0936FD942F4C275F5B334241B7949924E07859DB270BAD3BFE +C86FD3C8C157BC1802417EFA5AEC67C67729F460DCF50F40AEFF262C92DD3C46 +D12D08307B95233C096B0ABFCA115414EBE051FEBC3E9CF4A3A6F229C8422B24 +AA3E82DD2DE9E9DAD9858102A52DE68B800169831D87FABEA4351369D5CC78EC +B6E1607416DBACAEADE82819EE220BF346409B73DAAAF345DABB73D4BA008B94 +767DF352C52B7644BBB936B905ABCCFAAA2928DE21518BD973B2CB71408FB7AD +36620ED9D54158B5BD477DCBA04CF0B42A796F879340C4736A6C9912EAAFA9C8 +9F4B4FA517CD67FE0AD33525D6FE14374AA136D9BBF462C65599080220D01935 +DF941F1757AD4EA3F587F84276C2FBC610481A551D5625E2B3422C272C90A0FA +229BC37D06D40A8218CBE487021C74FE8834C0896AAFA3A1095666EA299BBA9A +DE77DF2E1CC2270169479DF9A1DAA5ADABA829261801BCFA556AE13D97D87E29 +39A35956938B17ABC005933AD3FEED156DDBE391935BA54E62B374BA08471153 +6445AF692BDA89EBE9A10609073086DC0CAF5536A273ED6084FFA474A54DBFB8 +BFC7C507A4F5807016E4429C45C2F4B70FD6C099F9844E9642AB1287E499F66E +7DF53620EEA49B83F564BF0B46E53C633A26361D307B040D7B34A7594C12EF8D +D76A4213F29D44AA1F7682F09A924C7722EAB9DD0B7C141BA9B017134A7A9548 +1C5F9C88427389C5FD09ABC2EB06B8A6E030140F3A02B59B6DAF7FD48653BB75 +E16CFFEB450C18029F08014BF0905E4AA76AD913F29C101735C5A5BB2A501181 +7BFEA9A8025ACD6F5EAECD826B4FA3B3A33C44D866AB06C3CF5C82C3D68259C6 +BEFDC662E24D634462654016BAFA72CB74CDA3715FC979BB24A043D6B2707F9F +E040CE5571105F904470360EC37F73541B528EB5BB52BAB9296B5DF1418404F1 +649FBCE2505038BED3C59C2EDD762CB5FBC7FA86E07C529A0B48BF7034860C8C +B5A144BD668E852DE553E989D7B71EF8C53F107F375AA55B61CBC9AF872F8421 +E21ACF007026DBB7F3BB1A5DA00FEDBD9661071DDAAB1D56DC3AD03A35DF9255 +EA2C492AEE4A39A3EFE798EAD76FD29DBFDB088B620BB0401C6B5667FEBBB8C6 +0E9DD8E1DCCBCF346B583A704D166B079140C4E7871449A16F65B8FC21FEC40F +E7BF9D9D0207A2DBB387FD8BD3A7B7246FF612C721CDC52D7D41426F3FB0EDDB +A937C38A339E3E83B2A5F300E4029F4F2845D11BEC33006716FDEFAF356CC981 +1DC615967B2F39FA17E8B632E0D738E869692658A550139B906CD8FF8DAAA906 +BBD7C48B6B9C12B40660248E3ABBE9F651D2E3E8888DC8CA0E706176EA4F63B6 +3EE4C5589C70ED426780F28A94C80EC697D1E082F46F3FF34EB670C2D3347F88 +A4D6399156D9A937B9DBBC40F6BB6B576D13E5D5462CFF7967E10A39FDF4F41E +8845E579AC534DF0764E0F403B28CC95A8DF92DCE1E90F17582377A5E39A5212 +2A0D2FEED125C900AB4ADA0061D874ACC5AE2B275EE15233AD5D8CF63FB3F38A +61C09E3F0AC1D5BF4DDA585FA65B115C01E1BF7EBB1018CA3387C8ACC981067B +83B74721D032340CCCE396B12FF61FB9EB44E3DE962C14659EC2AE7E20333A84 +9C16F2F115A340C9935D42D14A2FFF11B25C46FC93A09C4470A102ABC21DEB32 +280E91A9AEF2627CDFA6B1824F75B87713883D4881D452B5B4A7D0118D4EBD2A +616B8DFDED3047714F179E558F783FF5B190D8CD3ECABD9499BA020F0BCE19AF +8CE61FD7B87578F1FD471D5DFD21A019B0E810BCB90D3EDE346E0AE3E50283EB +BFF5D5B1AA8BD456AC552641D97276E1E7F335FF66372C39D2401D129C5AE204 +0851B5E2F8C322CEB29C19EF05602AD0D5FC2F8FBA0AC7E2B647C088A1F301CE +2B9646EC5E35B496758777972480C9332F36AE3B8AB6286E1414912B7F914932 +E2B5A293BE734C3052BD7BE8C44BF59ACD5D3A550AA70DC610A7BA4C8F210E50 +C257FC5773CF186D18E63F926618763DBA7C24F99B60AFD4D1B0FA6250540FEC +CADED9AFFEEDDCF914456559FFD61E175244606CF311AB9C1547A41B7672596F +960C00B0ACDE1E14B0DF3619A4B49E052EEA1A6E81FC5DCC40D783155FBFCDA1 +CB2D4B5C61E421F77BF0C207B504B9F4AA495409182468598D773D2C04739C8A +72050916EBADAA311CE4C29BB3873C27295A46D7011537576F4EE669541A1C8C +993F8BB33B5E6F16447B76525012F15B49FAE4D3E4999797F7949304F8BD08ED +59995346BCC901EE3FF11C8802A52F28F66F7DC908810B31EA29C26B50A519EA +5084113D938378906DA5989C65ED2572C491C953AE9A36D60C3ACE819C870A70 +56EFF71C92E6B08D5B39BAA48C13C6F68D172BF14E9AC911150272AD517F7547 +92F51675047591D4EAE640CA3FBF009A127722F7FD083D89DE04977CA986886E +83E7F4C2504BFE4A2F2619FAFBC7B849B30A354FC8089926B468501B8E71113F +33CD7791E7AF6885F9F795CD3DEB888940D6CD536BC51418AB1F8EE52FD9A84C +63DFA7DE8EEC74F136130494E6ABF7D1DC9A9E8968622804C39D7FBAE2075C35 +D78FC0E669CFC162975D4B8DFD7481F40BB44BC57B1844D0B59994DCFCAE8F7B +31C88416EE6D3764BBF15FDF39AD40DE82A641D5C8206B403F6C5504DE224341 +E8305367901F0E34CBFCA9948C6A897ED66F3402A988B25D7D5FB949D31B7E68 +19F1D6D4622AEB139BD718E4931BC1A128EFA2477568C5D4EB01C27804CBE74E +2B0D5362499A3B6EF7484A2FEF7479A15E712855BED59E92A62C97C580FE2C1E +7CBD35802A3D8BB170D3C97B46CC632B8EACF44ED53E114D0730038987973776 +37773179395A784B86FE9EDDD38C1009502FB403A6DFF6CEDF5D3BD338C958CF +4B85E3EE63D7233AA1CCEFA4E6F7D6EDA7B18D6242BFD605747BBC10EE0B38B2 +94E4694FEA3DF6B7C5E5B79F3B2D1CAC242842E6F9D33F2610CBED9015F2BD81 +EAE29A9A2904837617A13A16483AA14FBCABD16D469A20CE3D04CDA52B094DDB +D2486B3B2496A84FDCD8E80EC0A8A5641F4B32C4BD8EBB430D2ED927BDAF8017 +34A339CD48B5EDC20CDFF536A149FF65E8E77CB3EE7946A92C53CDC4CE9EA097 +6CC28E1EE2D52C8FDDEE2F02019C522ECB6668C14ACC3E5DF4FABC300526C6DB +0855A79FC44C7DED773D18886CAB73A2F2ACED5223D766612B5D263DD57EEB06 +865324E10AAF90B424A05EC6682FAE8917431E6597B4E1B88D5D131CAA714F2D +16BDC6F72D50C024AC07E5D0A8DB997B437CC47E921146C2233002F7A94BFFE3 +7C912996476D41E4273D266F9BD0D6115EA15C1E1985FB17B4425B7B339EC81F +23A3A66FBBE2DF4CA9CB21916EBA0165FDE10B4D7EA4BB8336EF343CC91D4A8F +7636B292F29DB1B0CE86468C487307785C584BAF4446B14636AE3AD37C67D675 +B6517CBEC34A4B62B2A8B3344221180055717290A8534C72628AD81A3A9D727B +80F52FFFCD2C719002D47499FB9BE38512B37CFE25AA80DBCC05DEDC4EC948DA +1E88CA822FCBAF8980D4BB740373821B2E70A21582A44CD1D543B39C9DD1E037 +DF79B9C17E11972D2676BE689DBC327DE8F579047AC9B721CC1653D912D21D43 +7EB4E52DC5819BD0FD03F864E89237B0D40206F009504831F2F40FBA2C4F4A9E +71B9953A8D6C654B4C3A92F22EB42D6D8E88A604F8DE9EE2ACE678513B8714CE +2A1762708C9EBC9A0B22E159BCFC4F16F72FF3FB41C5724D76AC1AB39F59C1B4 +B3407C681CD1435DA5C4E44700A4B12A247959F57F09DD57D03FEC922EC47272 +10EA80225C369E48586367DA5DB93748920C564F8CF96EF79C2D327B435AB31A +F68AAD8690864979B8224BE14FD84DB532837760AEC3179F423C23A2EBCE6362 +B21638DF9EFD7173C3D78D51EA560864E14F48A248FD5B532BD638BF719496F1 +48AE24A2ACAB2BBA942E2CD266F7FBC0568098C4EDAD62CA09434277F6F4B328 +97D974E4F40335115B70115F589FAFEB02EC71CA5B6B02B64AD906B2F0F691CF +4E3A7D1363AC1E0EE88D2DC700CB7782119D82ADC61222046D73B2A12EF635CF +0E24BABEDAD302D88BA598E8250861C41BCCE21E3A95B08183E56AB6C94AB422 +621DBA42ECF736B96A5EF45C34BC56427B8082FF8EA173BEBE0C348D0A2C1AE1 +4C40D031C30DAAC920937CD8679DCFF60C951E894E32CECDD8252B8259FDCEED +3C7386CCBBFC35568F5495E4CE1182ACAD245E67B1E53EAC8589A9489428CACB +3341F99743C4D81D9550CDCF4E2FB53B475426CC81B68F3D5BCBCF16986302B6 +DE01B3E0E6E1F9A1F605F51E29E0953AE7352964B43EDB112EC4282C8381C212 +02BE2E8EAB757198C146E5D1FF75F727D43AAF41BC6BAC8B9373AEF03996F7DE +6C60429B61B83190298F5E4E0233B33696AC30CC7D4186EC95E5006911C93E17 +A6283A9D76DAE5F32DB37344307EEE29ECC3DCF09E26DD93034CCE4141C1346F +B8686F25E57C67F7B9ACD41757364E8B656B0D2539C2991F2E5CD4913BAF426A +0A8D8602AD092E48764D4337223D5AD4D5EDC4E9474EC4A79E5F8D8D55396EBC +BA4A7317B54F9B9628C1C7A889B359CBB5691948E762FD406558E448F5080089 +8463475FCF5E50A97919AC5EB8A08815EA1FE0FC1A47C545E749DD85C735A0FC +8FEAFFFBDD1F3BA3382010756510EF1A3D310AAA8BE9ECF9B3FA49F0D2B73502 +E8F6D60035DFD9AE3AAD5632E7D4D332B0CF27B2A5051947D62EDD2598E9BDED +FC71D76746B11AD54204119BEECB72500F66ECB7F9EABD3DD88B27476F9FA6F4 +9B4CFED9C1A84681B03B5A3EC2D3098ED38F2EFE93D5172F21888CF7ED9999B0 +65DDB28DE5DB69BFB81881208D951700D029778111884BF70FEBF3A348B4A5DF +D4472C7EA45F027DF31B9923BBCF68FC6D42F89E780B05B8EE384F6FC9FB5EA9 +1C0BF43600E9C51004C58E7C6AFF658270DDD9BB2A6E7BC4AA3EC6D56917B276 +E824238085DB57FF709C890DF1767127A6F38074F955F24EE9824AA56654E0B3 +AC2849D8053DEE50984750B885F376B344170CC3C56B2F146FB0C785B4F4BBB5 +0E324CF3840DB9DE988E5BC5874CE59FDBD0BA494CF9013AE9818F8348723DAF +4A768813E9380447CEC2815A32E2044E7679E9031B489F1FB6935FD9F6B1E235 +5A44AD6D46B88C25BCE2DD1579C5CA7D702487361222DD9D8DD2B96DECC8D1F7 +2DEA85F8606394E9DB1C413B91297EEA29E46C4298FE51221976C5A5B0D9C43F +2C08535C7F49E3225BD89D859FB7FEC4FE29FF531035D7F1BC15928AE535E414 +37EC6A3E2D862A0E819F517A0E7D419679E302D112DF5822402A2DCFABA7BF50 +71D21B15B7E12D543992D1A6C83B76FA19CD64ECAB2704A063D74D9D512B0DC7 +E6B6FBEC7859E283EA3FE396B2BC1A17E8370A65F2A8E1B5DDD96659051A65BE +4517ACDE751CDEA75DFED139F9151DC208487575B83385B1429527703D671144 +156B906DCA4CF416CB592B3187E35DAA04F793BA32045BE0438D687C98EFD5A7 +82A5EE014ECE289BE9CEE29B4A3B7B44F0CD9C64849136705A775FF183B5B6EE +102265FA44CC976155C3A0DBEA416ACE591D86C04D70A2E9EB20A288F93B9E40 +891B6A794C68B0AFB9D34665B51FEB52B6D049C8700E1C622DBC6A20948FB8EF +2C6D8AA266C29802F712172055ABB9C3DBE02CA698FC66E015AAD7FF09C2674D +AD4DE23D1CC794A8052BC235648E0E4D2D23A9A2AA5B36A116FACD1216704855 +D0B004DE763CC85245372C555D14E52CF0F84AFECA601F7071C2A72715B11C1C +18BBBD2679DE8B3D7CC05B7391E22E64EBB20800464D2EACF37FE6ACABEB5CF0 +E0BEEABABAC9EAECED1D0015EC93EC3DA8E55FE35D393E6F98C7EE861AA29E63 +4CD536296EB8EDE8B3981A8C13CF0CF08504FDB38DC00C98D8E70072944E2099 +1A1E7FE0585DF32DD336E57A7CF20F7518A64A408955ED92828CEF3998E91F1B +935FCAF14B2F5E6037E199EE276AECD5E419838E984F98AA715D9CC3AB7CD27D +9875CA787F92E07649FE979F0EF9C111A28660034E5E21DB087A413F97F5F1E4 +B2CD771AD846F134BDB38DAC28DEBFE4947FEEFCEBB87CA5B82C5DEEF49B959A +E6CBE43402847A824D64BB22CA8DFEDFB72F23C55CF7C57D157A6ABBB4211973 +54FEB121E0E0833908959E1D39C7E2A51965081158A4F88936CD27E201BA09EC +B4002C6D246B2BDB14440465A55994330381E3E86CAEB06045B92A12482656D9 +A0287CBF975039E810C1945C5EB1CD9DC31823CA125071CE4C2B7DDC1936C33C +C681A518244F6AAC82BCB22A1F220894EB24E8A974AFF9050EE3F4A1B320523A +7F095B60D2256E4521CF3FC0A4D90F13A376D32216178D98ACAE185F0B0FF401 +BA10DAAA0B6F99F72DDC08D4272C70CFE48ADFD443DA7542FA0782E68D5259A3 +862139A5B4C1E878D8C9F5F200B2F422384056329D8D795163F5EAD318E7C522 +8ECF83FF72776DE6B1EE7095FB101F38E5154BFDDCBEE89CFD1F9A393BBAA13E +20BEA2F8CF709E99D17469D2E6C34187F8403071288243605215E4177AC5AE86 +E336934B8EA1820046 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -3445,7 +2587,6 @@ 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 @@ -3700,366 +2841,360 @@ 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 +2D6AC3F8AD690AEC0AAC2AAF8CFDEE51FE47B56661DF84FCD8AC27A0C21706A3 +3CCB741E91304FA287688FF87FBAA44DAFABFADB8BE47AA6C623BB1E86BC855F +B26CF97B7196EC4BFD755518688DB56F77F5EB87AC368FD46E295D7DC1B5E785 +DD301E260CF2F1E9E23072972E05FD4AED7A5AA34432BFB817DA2C19704A0206 +3077ECA9232EBF203016E7D98E3DD0C78BB0E332579EF7430063A099B9BD86E4 +3E55A8FCC6397B191360C8382BFD531BF247BD3686BF00A96B8DCF25BBB009F4 +ADD3E77BFE2AF010F83C1BE339B0FA4581782A246086668B10ABE646B09C1334 +A894212EC934EC80AFEFDFFA7C6EA84F44E072E3801864398E192532476CD8EA +9492441B0A1FFA3606ED65A10A8E8A87200096F3A8D3218CCE883A453ADA2B58 +1BA1AA2A5E3EF41A7F224F806FA47E36796C659C9984BD45AF96FB8A5464886D +46FD31A07B390F3CE60CCD246ED0E1CAD0521C7AD4D405A7A5606EC545AA78A6 +2FF931A5EA145350006F96E4854333B4374E602D71EEF218C15C31D866F3417D +147D88DC59B7485C532521BA04EF26040B140D84679E38DD71576B4D367AA58D +B4CCC2B9C8CEEFD28947BC07BB494AAF2DDB0136D77350BB00E2912F32E23D0F +54CD1A8B717A6973F3B87A627A601BDCF84562F771D6627D9987F659E04A205C +6EDA3339856C673F51402AB278A8099E2C38FFECEC5B7AD60F1A573995AA93B1 +F7FB6FC8CD351F101FD629969DF1D3DFC67517CD5B69EA89612A19A1288840F8 +D2AEC8131971101A4563BA13DF95EF8CFD634EFA417D985972084D45B94B8234 +2437367E0F2F5191C2C721CA9453CDE7114B8A952629FDED8C0D49B505623A8B +EA6267A8B676C0A2722D9E1C8D4B202B949D86F3DA5861E0AE858C398D651AB3 +500ECBAD16B80FAB6565F19BC83C7CCE995A21DE4BA42D5B346B76F0A64687AD +75931A022AAA078DC8AAB00146D59C041A70AB4978D6A4D809E94E0F849F8379 +DD126929166FCE6EDB1F47C10DE60A539D53181D88E0280B22F5CE53F7D794AF +4D60F82F098F49FF48762BBFFB7F47C813999C3C595AFC86CD0B7BE65DAEDB32 +CB25D34DEB46C4AD0D21BFC3A9A11405B0873D4E927B81F4EB1ABD547CBDB6BC +C28B2A1E34685BAB890DDF3423848ABD848400DDF57E5E5435E5A6F73EA79A24 +8AC886D63920703129B258BA8717973CA2FDE1E6755718E9283491C6611D4217 +131352587901769AA8A21F616EC20C1194DF5BDF59F980BAFA88316E78CFD776 +6C105A0C3CFA40AF83551D9C4F5D237A38CAAC1AFAC9CF03B0A1369DE1ABA1DA +B1B9DDF82D9FB40BF0DBD74168E1D65B769292B48547DCCDB8023FA10A81431D +D252B18FFDC276D5CF4618A7BACB70660CF177C6496B0B36E2E8C1494640BC00 +11A25CC5200A0C9076854B095EBE850D0AC6A736F8DE5374A7A8532AC5D3AABE +8A1587A7BC96C843B1D57C0BA320BD7E3600CC8CCFD4AD6D3EF8D34CEBD5EB55 +B545E390482BE9AA96C298172F0879718031CBB6173885E7B425115A934B23A5 +C5C87D078B81C776A2B72E564662ED3079A19F4C2544CF1E2DBA7EF84E0EADDD +9B98E93F5B9CC9E1F63BF5D3B4AD23DF0A82CC481E2351274426E3D0986D852E +106CDD6D5325453720F02A01A21B3CC7EBC159A8AD8558F049061AB37344453A +5FAE64E67DFA79E3FA729C275FD32BD38E09815B5C85D94909E448627FAA373A +0C6C1CBB3A8C8263D1B4B3A080D05B61C2C2B9F21090B71663D48140DDE065ED +14CF9752E806DBE5E1BD69A9DDFB250E9EA0D4849962B18360F6567BA3554817 +4F41D789FFD5700F85043461632C060C3EBDA9445C644E092BF3F012E113A766 +0ADA5F1BDBE806E51B294688FB8397847E27B311C9F0CBC64A8DD820FE887E63 +3117C3E921CAACC57F54F19ED20AD61BADC8C60DE9FEB1C1C3E39FF01BB0A1B8 +C24D14CDB1170D17B82180876C5A920DF6EBD0C31D283438E086ACC4042B1C45 +E915702288FA47C269BC22AD5DDE54AE8D599E6D77A19A362D49B5ABB051053D +4D7CE175432DF3C803F934690D1EFCBEB637D314982C75FD2BC0EA5CC6A794F7 +FD7F7B158F81D3AC9E3A7F55F6A98FCEF757D5DF114E5C1020862DC5BD8DE854 +57BEE746C45E9108F029E68717FEE815A4385466AC97F5F8F4AA6728D76929BB +9AD49089C18707BE23C449CA50C11AEBB8DC6F21F9497121887FC0D1F9BAD1D5 +9238A6ABB6DB63EFF800FBBE29A0DC6E1751B578B152BB3845AAC8E6022599BE +29EF5325632340CF216BBD202B61BBBDC68F91F7E47296F3C257CDDA95955884 +398C55F58EB6C08D6431602DDA5BFEF5CD477D489D6902C2CD37D25492DC1222 +CF22ABDF01EF0EF19A49A4A403866C910B080735E2D8211894D8BE0D86D0AF52 +5F5417FE0D8028852F06C64CC98D3F01B2A54007709EE157F555528726E44781 +696DCBF37BD1E441A54F1C058579557C35AE5A2A8099615409F8B8764DCDB05E +6A46BF57FAB00A33C014694E80D5AA8A2182E4C648AB7D4F83DC10B83BD9601E +40AF9021381DB253C2125357F819F9D01A17AE3918E21D859103DC4D6966D167 +7E304DF9694D5107DD6F6CB4416642C4750D5BB85CCDAAB368E324A8CFB09E0A +5877E1C1F837B105D9B61E1786D26BF02C765D3047D4A8C8A1F12CD5062BFDEF +8516AEA8078F3B6F09A6FB9C967F832AC5D79354B720F0466A2D8620E56EFAF4 +8F959C4D8E1A2D572E3290ECF7C831C659398661F59B08EF3AA2FACAA655C70F +91E54D53E67150245CB81A5128A30B4A061FB6575EB0214C8719E08C44EC2EFA +B3A50CE947C18FFC3F8557910E1FA276088667A86FEEE4EFC2F181C49DEBAA69 +59B6F48917F9F433C7E3FB9ACBF58FC87732424AB7D1124A10707967F923CF8B +5020E00E532CD077D2CE6DFB2609123D15B8B3B1D6C6E00FA58B83595E35D880 +AED20B11E908D9C61993384A222ED458875F966916B03CF8099477C312ADE6BB +1373EEC46B823E91DABABEBEC7A2F76FEE618C5821FFB6C5585D73559D8AFBB9 +0FD916018AD8D0E6FAEB79345BD6CF14BA080B690A2EF0B3A073DA81B8CC0C5F +3275336F56D0563F2A536268E35A849256F617645FEDA785FC96B0276E96F91B +84793029C6B98AB7605B9AC5F63345A5E91AC07397B40EF856180B334BE47108 +88D856185D0546DBAE75253E778D803D803A7B246F9BD2B6F3A12270071544A6 +6F173B4671B4AD3E20C94688DF7F1CB6EA0EEBD1B06127A7E7DC190E958AF0BB +DA59E0B940E3A88FEFAC83EF10B4282397791034A69E7C8DC10B9AB5E27317DD +B5508FD10C9C02FB0A9D083BA060A6E6F33F48168939B27560F0A080FB902EB8 +11E9CD74E7E9448A7BA7484B802C88073CCC280ED4FA164132C4A7E2DF062525 +CF9D9285009EFD6FD1E30D5AF0BAE568E094D4BCA5D86CF88A2979ADEE744585 +BBC8118CFF5D83364B01620C8615C07E61197215F06D2D065938CA7EFC7D3351 +0500A71A05CF47A5D67F24AC1C7BDAA977EB2A1E5370AF0FCF7FCB16F0A7FC14 +BE31DE5BB0252BEB0EF974B1D58BAC12601424057C0CAB73A6A7883A54A72309 +DF9602ECCAFC29C319DE45A6417A8CAF46697D742F2F861122668CA96736658F +9EED30163DCE9B424FCBAA19DDFF07C324828BF6B5AD0DD41B842F8ED254BF10 +5549BB7474D41BE0FAC170736F879B855C7D2133487F5BCA5940A45A914FD141 +5EEA94FD36161BCA86DE5944A1AF9FCC3AFAD2E52BDEDBDC1913046EEC5F1368 +97CB8C7A1F8C031A151DB23D42279970320F3F4B961D1C7803BD07514BE2C03D +AB3791A9F82C545A5EA3F7A2568211926DFE2AA0CF0B706A5763F70D7CD1F39B +38DC8B5AFACBDE0F55E1F21D4D312217C6D31C9A93DF60CAA58887CE62C4AB2E +66063E2EDC7B4F5EF539C729DB9E2208EE0F5C04FAEA2C30C38FFD84F62ECA53 +4D42952BB3683DEA550954D19A94F651C6D7093F5741902DF790C95507C31948 +EC909649F6809922DEAF2B47A9A376636D62B6049493323F66C0A8CFBEB66AE6 +31C69BD8F7EE51A9C5DE688486A5DF0B2F03ABAE0357170F70ADDAA9A1EB0D67 +12A4BAD07C47A753453575451AA5666B84DCC8B427678C9B8BC130CFE9207981 +26DC39E6BC715E0B3353C34FB111AB26DD3FED9E0E00933B3E2E357D190FF99C +56EA982EC3BB7ED0BC03F3408276535A338D72EB3019C77E70F4D2F52ECBA7DA +00FA4A5DAD777214FB3835B5899742B81ACF0A01AD0E47A11D16AC55122546EE +79C6E93F51101435120A6AEEF8D022997C74FF0A3DFC6E22C9C929ABC2CEAE9E +8E43B6D0BC0EDFBEECB5831C603FFC9D0BD064AB54C9A449FA98CB1FC2238903 +2C57BACDC05791FE45F069B794AF65B52AB5F8120C4008529FD24717ED17B0FE +D99FF7C5804D303235B6F996FC2A02DA9C392A066812653B8E541BC38F309F4D +AB56DCA08695C11849BF155FF173A96290CEA2E74C33C3F1CC77D8D8C6729249 +2C0E9FB82477600B6569A3CFB0AC9285843BC79F226567314F2B0B9DCF049DCD +72F37AE1337C9E822A1191B3C2DE6B96D69A2BC14660D0FFA7A4D51BDD640E90 +16CE25382C382686FCEFC1DB233A4B0906419E143A8B63975FD8E07D092A699F +1B16C8576038090C9D5439C263A2B2042EB950DC0EF2C18439E4C0840CB7A29F +27DBF7EA1C4EDC0EE3506FB3330E8274EE311F0A9207F13B00FECBE42F8DCC46 +63476DC28C275ADDA56A84535087F79B6E15083E8C855ED6181D266D880ED1F8 +E4F33A602EAE4432091423C3640E49DB68E1EB83AEDB7739049BAE3FC53EF314 +93A74C45C2B1ECA469B7B52F400CABFF431B220AD14E1EAE70CE0B7C9C89A236 +90A45D4B3ECAB3E7CEC2B8AB30A0D39A3E10D6A0DF6B7C3F8EF7268019FC952F +F8D47DBCC809591AAC86D7D7B7A6DB12561FEF0531069CF4FB380530E65082DC +F1D05A893FCCD8938E5FC23C3654B3A0A352034000310377DAAAA4A15A76BACD +43C6BBF93E337946542B96AE3D133575C60CD13D202DA617B34C652A23D5E904 +97E300667AAB55FEC698C89647284916916F302146913DA5B003EC153C95B608 +9BB1CEF3D6141280875BF1E144A7D4D0B9C08152ADF2D5A05D101697CA36147A +297DA42055ACA9652CC9CE0D596A42A73268F062B08E60C80DB50C81EA0180CC +698A7CD50212524CBC3E5C7103F48D841A50B6506E25E8B34A6096D0359B0870 +B5109F7FB44876D24868B5EC0AF2F4E68FC0444A35AADFFC68183BB6E8F8C7CC +6FD42F158AFA49EE096CC4432640F86549C565EEFA779E2218EDDB73AFE840E0 +590A8440CEBB2D7BF83256485E617685D05AE401C7105CA5D520B23265D7A109 +A638A5450C19C406AD524CBE2678EC97DC28A9C8307BB7D6F08BF7D7DF07A280 +F8DF84BFF4BEE3035B6A3133292B96918618D8FF3C54BE5215DDF8E5A9D3302F +2154D48D33E374C0128BAC271F4B5EB30FEC59E702B6D3B078752AFDDE547CFF +BD8BD019E775DCE680B6641EC6B6C639F9A81E7A34843CB7BCD6E26744A6F2D9 +7BFD4E207205B988E5922B12AA325317455667E5A0136DADDAC92C389D3F7066 +DE370042F545C2BD97CDC5AF80B1263B937AF92FA75109FA64EEB0E9A83918AC +92E8AD5D75AA769DBB2453B42CD1B98F689BB56E9FCAEE456C8F0549300D22C2 +7106962EECB67FDDC78D109DA76C1980BA2B4B89F2305414A72E78CE66D3F162 +543B266587800FE3616B55B1147525E3DC456BCEC1665E01C027354E138D2880 +F0B643AFEC47FA16D6C6894D45627419E40C40F6B34E663B4A82D4672115137E +52F31600FD88473B0F56EFB50B3402A1DB9090520DD82AB3A00D8AA481B01CBC +337194CB49972EB557D80F3A3BE89EBCA984D0BD45972AA47BDB66816F5C9E99 +F60FBFA6C31D00B1C51A293268BE49AC80A4A28F919CB1AAB7FDC28D2A1E805C +64775C50ABA31A86F812B2C7FBCB1FCBFAFC0F483E4F9174E60716C51CE26F73 +6A36B5566E8D616E6CA9A7BA4060D16D51F7DFFDE45ACA4990FF43CABCCE04E2 +B69C7B11F0F4C0A9A9788539BE8977D81223B98E7AB76EADF95C6E78698385C1 +8D70AF232AAC9BE222D954F5C7FD77E938ECD96572E5B8753F9A5D403008118B +CC0171A621C9682A25713A31843D74FA7EAD73141F1E4554FFFC71A02EB86FB8 +320942E2BFDE7678AF71FFCFEEE3F9328458DEACE101341625B05196A3643051 +12037C9E88940758C8BB69C4DB90F58F798CC00F2CE50FA30F8ABF8C6A2AEE5E +DBC15B5C998B2871A2DF437A58D4A00721B023EC53476FD538E99AFD36308EC5 +EAD6570456390AD49A6049794DA7CC4FF90D52166A6209D4110C12A9B740343C +202E7483F24ABC0D95B1C6044DD9674CC5B6432BA242581DEAD58B7493AC11DC +AB3015247EC7F3D5FF0D38D4B33E1FE09E5F63704084835BD6CA565E038D2CD1 +00A18BD30801E0CA98D6C2A2767FD2C74D3BB821C16B5E3EA835674AEECEDBA0 +7A34BF5DF232190502712891930C61E3AEDAC418EB9F7992E220F63855D16D06 +0A586D4DDA86EA7634E9ED540882BCBE098AD73752247FC4FC6453406CEE1E19 +0FB84831CCE16EDF748DF0D0B61AC2CC3FA8D4C8103A051B2204E8A5166B2CD9 +2650854A9BC8AF642EC945B7DEF10CC7F9BED36D19D57AE0F39E5B6D55472F4C +89F21FCD45B6570E02B234FFB4EF4672B334732230B99E8E2A0A4267C059320C +CEE8C67EC198DB603CD01968E83A7B0134FE4133B4014A398584AB71CCEEB998 +8B60B244A9D7FE34FE77A2143F668D600F923C6B3CBFFD6D24E6A9A5C5869A32 +B3ED6963E84366203EB82AF9D181EEB36676D4CD3A8B694F7585E283767C5F8A +EE0142AAF74167A0CB151D06F05F78C984B1A6D88053F0FCE5EFF2213A6D3337 +1D20E7FFE0A70040C5B9260DBB781DE09D46220FFBD1372D662A9898569E109D +07D3560BF1FBE95ED391EB7159A16C8A214380D5C265620C38B6C9F24FFF6C7F +AF5B82AA8C84E514B86F314D3CEE3F5A357676570A085F42AD1D2F7E1E6B544A +A96B365B5C47ACA4068F3B69ECB25B8BE74834D7E7BA09AAEAC1797D5DBBB08F +31431F5E50273C641CDA5EC7C56246B6BF59C2E56EEA5004F7FC36FB1A93D8F6 +30566A260FE38A2EEC21BD5439E15480FFA57A17A72786E98BEEAC8FFB530D17 +568FE3EF5F1962359DC7E59DE5C721FCF7A330495AFD7F38A8CB82B55A826918 +E4AD6A84648EF1456658F5C69FC5BBBF54ED930855FAFAE82CD4DD3232496A43 +A329413120095902FAD5FBB54A5D9398FE0EAC4482E72A5655C966FD27CD7BAB +A94DF1E54E7E0D1E9861954B617042DE4D34D2798A628D95759437A3A63D3B54 +0407330F3CC93C476941EFEF1590090B60AA39B7759E96D5784D36A93D02B9E1 +25EA97E3DAB0AE147612B1C61BFB5A28DB7DC903CD9D14545A49998F9E7FB80B +97F2DEF6D2D9D3AC968C71C3E7CC7B776A4D0CB3D8FE9F351DE74D8E28DBA6AD +C7B7473051D372495D51F32E4C315F7E1FEE69FEB50A2AC41B3D753E788AF83D +BEC200E32832F9290610042A74E2ADD177DE1F553C22D836B865673FE8FF62F7 +29B760CFA8C58EBD47131AE5F7131A8551BF6BE477EFCDBAB0219F411B54320D +EA1E74CB6598DFD42AA22C2A34690F90732FA72F3C1CB6AED96A0652BED5D42A +790A25FE20AE2FC4E8964F0A1ADDD2E8FCF6D009CA95D41B70A3E82536DF3F3D +8EAEE50310B1FBFEA16472790ADBD69394F6AE200154B65FA4397C88195C5B9B +2F4C67B813D148987097F447A890A17CEA1694F0BD89B77FD4CB414A0A18083F +FD48AE1AD4DD1E5EC5AB821061304774A1087E6767CB0738AA8C7207B5CF410E +1075D74B27F4DB85A182B27A3DF94981BBB315277C70A22260F4A00EDCF7F3FB +FFD5C6D3B18F29A1DAFFFCB352972C15B13E2AF9EE1C2196A14A4D6F64C76F1B +340582F1BD063F9D63990FAF20CFA09785353D4A27B9A8725D44ABD8712BE25B +56C88B435E53BCBA60D38823BF93368F45A4618E234F3C1BF2C1BF13FD2C82CC +85E59E3FE4DD67CBB4AF25DB3CF82A2D47914EBA390EC87B893E3AF3DFC12DF3 +B36E8FFF3A6DDE708D799C9C9882CF5C568B77CFB92DD134D6EC86A5FD0D5B46 +C15C4A13662FAA49705CE1A0809D5C29791C13F153E622DBE47AD5EBDBA07E78 +19BBA14A8CEC6A1C16DD922476B6A7EACD5E798B3B2457FEA6779140504840DF +57E22B3F4FF33B78C8CEC5BC11FD7905DF6A7501340CB40E49E86B8468E13857 +B8FA4345E8209B501B30829128526ADF0424D12F8FB7690832F9008472A62055 +0F467D4DFAF718FC2BDA9A39D77E2EF4550A481956E8D126593BC8A7DE888A78 +02709AD3AD0E89CF46C4699B8337E505C23382716E37F3384F768EE37CB11462 +2B492A09FEC41C8DD33728441089A0D523EB1BFB41ED365A5C7ADD082D14045E +200606FD8B2498D9A81AC8DA319194F4F71E5E5E966DFB60F7114977D0141C4D +90F0984C5438D6F455D94B966937EE725D480112E62D6F3AFA41186A9C9EB7D7 +2D7CD239133B2D34CFB70DA8FF64C2F84542264E8A1166A47D70774F6BDC422F +2474C6899E1ED968A41008705393D50DFEBEB92420F9AF90EF638A96192BBF38 +81D1C5DC6E3FA5F2D9B6E871141CE429A37BD00763D1FBAFDDBB50A00AC924A2 +388EF0270B15FA03E769F1AFAF0465ECF6B5537AD75B74A435921D589DCD7310 +595F4A62DF89116AAAF591B34F09E5AC07A983338C72B432ACA1AF0794564DF0 +04D1F0D4E6D8318A07578FC5F962E648948A7272E2E14CEBCBBE138D9B4571A7 +2B38DC96C43DC31CA8D34A5F52A4E877E8792AA97C95FAD01EFC5D85FA13BDE2 +70767FDDF7D513C48C257C141501CC74314300585064F6F5F25503A89F8DB27E +FD36F76BD2B84E24F0D0915CC297995E640FB029676E9277A497A6BEB80B74E0 +6391BF4C52707461D9EAA8D5ABAD4BA636FFE5EF82C6BC33E7C15A684FBE369B +28EE6F4D11FBA39EF06FA10CF15E4333E3C9A1BBCA3C3712C2DB8F43B5C36854 +FDEF11F528DA8DDE4A6FEB1305D4BA73BBB629FD53A74AA41369361D518C0BC8 +13C826F2AB3E8335481338DE18EEC9B8DD7E7F01F44B329A2BC1731637A70256 +2A6CF98151E8338D7DEA6FB0EE2168EE9C7A4B07E91467377F23F1246EF71F1D +9084E6ED573959CB55BE5D1F91FFBA4AA7E9DE42599E97690EA268D3CE467658 +ECF76521D18BFC3AFE305C7AEF0AA44E4300BFB6995EC9785540A90C9EF8AC00 +89F0D74B5FD167AAC40A5352A718733DF674FF9164A930CE03909A93B1479248 +A41DE8297192CE693F89A8BC54741B0EEA6841C16A3388D3564E10E92C1BEC86 +2B3862E97E424356689B9103528A71831018A759CCA7BFFC84B2DB942077E02D +9BCCADC6FFA13E783B7AD4181DA76CD2C4BD870374CA65D1BEC518C2728833F3 +FF038028DD38D8811EF8EFEC4A5236D42E5B30CEC0F06F79584441C432956F3E +5CDF15196926D06D3B4729A41CEE504F4599A193AC71194C17DBE38E6684A695 +C6EA3AEADC8ADEA55AA5E42147528E621D78ABBE5C48919BCDC02BC74AE7FF1F +486B782A288C4F95639C05EE7A42ED92188863BD1475C7C54B8684F691AE0858 +B6B2C063C3A7D3DF6DCF007C2F3836026C31A2ABFFEFC053512F0DF165A11B8B +EBC10B920152FE283BB8A984F2C63FD9D7596E29093570390F878368BF418B32 +649935B8E9296983A62D2F0C5D4F5F23D1F249A9F2C3FC1143468106FC6A1ED3 +7CC2AC98DD9784FBE00A972F36132FD489730913BBF1BF2B17BFE13B910112FE +2C735843BFBFF1F9567DF38CAD16882CB769FBB505365BB9BA797CD743C34F26 +5DB16682D15DDB2C16DEC577C464520AF87FD33835579D7C067EE71529DBBBDE +030BE21CE1E76233C038BBB9296473E5FC64E6C07F0DF7322C88E4014BC1BF29 +6A65E6D5E8EA12BCD9F53C4B3E0F8202E082E4ADC8604D59862EA62AEFE80F44 +E917E635D59A06D6F05BE53CA22058BC8BE3AE39FD965D6C622F0571BDB4E9AC +C3987A5821D142E62ED17402E332430E92FE10B9DF8E3C0B17E78EF098BF4CC7 +88D7585BA61F5784143323AA813192C5BAB971956B5CDE027CE8BF56C8C8391C +12719AC323DCCC8425A7A637957DCE2369B73B1089CE53430D341BA0EE8DB907 +C722B00404D43FDF76E93774896F8DA82BBA116051BC4BC2101B5655F76D76C7 +868CB3E452D1A9945CDC9A467C6A1D74966C01B8FA7C8A2E3AB73CC66910A771 +AA23E6F809CDFF8280042A97B0FBF3212CED3416A7E9E1CD33B39A491872CAB5 +1F73D7AC7A7D7ABC70DDA7C51ECBACAE9FD3A5EC9F51F68B149561C41BE5F059 +48FC70F61E1AD84CB2230FAF1E88114973F1A81732C73CD8CA14CCFEEACE7038 +14CE80A9CA48358917D78BCB14E925C2D858232163D0937190C9E138D5CBBC4E +E6D682B3F596C6CA5E585BE658750587EF9D14116FDB48CB82182AAF32B5B0C9 +0DBF994BC19D887611EFE916FC6D162986CAE900B73C7333290DA365D8E5D7BB +7BE61119741EBD884D1A5DF8CA8E7EB2F359DE8B3097F61BE2BA74003C1C499C +B20A617275B4BE6D6FFE2FE00BE02FB72FCA427A366D1CB42719BA55D17DC2FB +482223E5A69C9D3C5B6F651EB69D00F335A8882E650278A998A2392C0CC0E947 +8EF50B4C80B84047CF9A26BF669254BABC1AE1A6D09675DFA3D5BF9FCC4555CB +32E446D28F2E5254B160B864F03B70067EB336E185F4E23E0A66DD752872BD3C +2B1DEB68093E53E9727275091A697231E9D6807405FE5A6A13D881D13C080AED +B600265E93F5F22DCD02DABE93FE8734C628E91B370812B88F4849CE0DDB7A1E +0341803B29B510CF216F5DF0C4B5D74C323EBF8788FB492109F8047D224D8E22 +301933535D47D8F7100D27BAC50469D4AD7E34F77685F53ADE69E90877555B1E +9A3F8FAD10B4215251F335FDE5A4C8F426DD86B3F91BD157AEC3B5C303B802E4 +5869FD1830217FDCF769405E36876E044084C124191EEEC6BE575B818344BADA +9F51B0214CE7E7DF6891165B427F4DB1744030B6E15AEBE289392677A6C93994 +6F98539465E2B5C7FE0A8211C41DC19D43279E6638BEB06DC30ED8E82551635D +F80221BBDF299E7B7D6781BF601B6877C7FDB78716BF6B0730F9498F848D3F5C +0D24F91B767D634C67BC6D979DCD59E7393F284A1BD4E824B9C93BB659E6CB3E +77F693BB2D1D3219502257D2628C63B79EB4BE2DBF1FB683CCEB7E639A87D599 +D6780961178D9236A086E743EF447A854FBE73C7B983C6BFF0E602AF9366AF00 +6B75763481607E1103693406381601E29CB57A7A66F300820BE79E018970C7E2 +4B7A15DCB7F1B7BF1797F239F3145A37EF67BAE0FC725E95177B0FA091DDAEA7 +AEBE6CEFCB1EC0C244EC7939D6EE1BB525C8902B0923B776350E6AAAF8B181FA +5BB7809291C9F85FE67A32833EC6E226057D39EF8BB9C71FCF5B081AFFC496A4 +FA719E3B24E9EC9741483447AA8A823048984FFBF209E1609D0E3E2FB13A17A6 +B476E204886DDF9998A6B1BC3144EF6EB322928AB80D36269920465764A08628 +1DA8121E87DAA13CE4FBA818B88D72EEC0DCC5ABE99912905446B18C1703E3FB +C190D814B34741D3B5A745DD8A445EA8334CC2F26CF2AFF782E924C90D91EAC3 +8EE8FD657C8EA154425FB6260F5B1EC55AC5E7A7F15C56504091C0B8C12F4AEC +978E6D16ED42ADD83AD5BF66B2643AFB79B59B775BA8D88913CBA64D10185A7E +A0CF32E350AE655AEA3A76462B7202886DB4F192F2C842852DEC3F3C430EB3E3 +A67983303039E332867D11BFE112CFAF3D4DA98C012DBF69FE4C25A9B8B8FD3A +6A04F3675E73F202487188A7BAFA7F8DA9E9A2EECA64E7062FC69B95E2A715BA +66623D40E2CF080DF61ABF9C656D1CE8C44FE31CEE80C0730113582B92D78F01 +B61BC6AB48C856592B57013C3A65CCBB9721F703F1D4560528C20EC19D721545 +BD3CF85A0617D2FAA302C9AF7010D9E16702002042EC5FCEAB97FCA98D6A9198 +8AA663C6DA902AEEF942D8FF037389CA52CDDC66C7044DD1BAAF8706FBD01E04 +2D232FE649E0D0E9F9ADFB8B49C4C0213C5AD1FCCD2F78B758B756ED2EE66D98 +7980D4548C51911E94BFC4F0A1B8C8B3BED0F88B761E745CB4426C0B588CE66B +4349049897C6BC62F514CBB20B2B0D7F3076B64BF6C142550127374B8B00E0B8 +9DF62ABB9B1F9B6A6F77AC00D2FCF0114AC0C37EA54C1BE43257CD4C298903E5 +8DF8548E83D24843AB59B8D3C26003309DA04432BFB817DA2C197C51D9C9B340 +C74F849171CB3B868D4E0F69B1679FF5998D4A9F91BF3E07FE734C589157C10F +A05B9902CCE7A17FD9B9FDB25804BB91AC72C746B3F93810CA001E58B07B53E2 +B5A4854624960F5874A2B3217733BAD60DC894ED947727135C6CE916369EB538 +208143B8BE5F0039F4AA35DCFB8FDEBF0D29B27044926B732649355A43CB41F5 +39C53E37B8CB3AD3C8CA248FE48E3FEA3B3A062BAE725C9A90759F26448457B9 +940F7EC7043259B64A8634520560B3F5914E6B2D81EEF2FA5130110CD4E24C2F +909D8A71E3600C1152FBE85306E0E005D5A665B20AFA7E039C08F52DFED85926 +12E8AE9F17014CED627D19A23308F641A09C9DB5A3CB8C4EA818873D48AC4EE0 +90B0094F29AD39D719099EF49C4DAF61A3EAAB108563529A032CF9145ACD90AC +6D79E73F6C93A9C6F86E4313732282CF1CD57B6C4A1EC0BE85B8829AE083834C +049877A4729F0894764E07CBA8B842A83CA8D121065096B98AB299D768EA3FE0 +028089ED4EFEBD415F4F53E80B9C380FB3588176AB7A10452DAE926B00608E6E +DB7A0EA1DFBA09EFC288E4C1E3702D304E3A49A8366367891600083C3E81CACF +8B700CE9C04152ED9901BCC35A5F53AAFB97F375502A735EF9A390C0F2CF8946 +8291A94B863D38DEE3B61C998DC2C08DB844FC30F78916FC658A4EB91797E986 +A1D386172188D128F683CB64267A715522091438457CA9AFCFB476F46634D78D +309AD3280848255EB1465975654ED124F86FBCA22C4CBAE006ECD27072A9E2F1 +2B03B5D312B47D17D0D9A6112BF0697BE5EB3DD040D0BC7D7CAA92F0849A0576 +4A634AF01B3816FB59EB4FD63E28086F4308CC2C2047473CE671FBF817CB6E89 +37BD749C9761921FCF96E10FDBDA6F4ECB0AFBC2B9E3FA77F3D12462EA6D2074 +8549634FCB16F304C1F204689E7C4F1AD1D8A34F20A073A2927974691DC6F248 +B5AFF93BAF96C8F24211502E861D11BC276FB30141D2358C0C3FE709837B2070 +FD7D3BD533EFA423F53E34374ED967BDAB1D9465BC53EDB8EB53764D21A49D65 +6BC45FB6F4C3E663BB93ECA9F3C66534418B4432B0349018EC8C503D7CD38384 +9683AFBC0D6E1FC4C51DF547F927404E475CAE960355B7F63B5C9617BEAABBEF +061E35DCA59FBF1AA58803170DB43BA1D458F21C7549CF57601D451FACFC93BE +CF72C626AC0E6EFF7C6C1265DED3ED04308CF0C139630799B7B710D39575AC97 +FF640552D4087E60F5DFED48DD998D29C6532005C8B648E51D4F85A072396E63 +A11CB388893B813213B4FBA4A500D8B8077ACF86845DCCFA3B139F8C86AFE069 +D497DB26E526424DDF6BB981E08D9CC1A5560754B95008CDCC199048EEE8E6C3 +AA3F255C4FE4C392AA947F614D422021A55C4CBF5D9399AFA2E715D31B2A9F95 +0977502A1F511219FAB7DD1D9CB67932C8D0504DB7B2864B2FC1C4CCF03C7FCE +CD4C0985288172CF5D76EBACF180FDAD74456F832AE0A013EBFED26873DFB861 +A0F2F13D9AF8C90EA667B03956DAF47A7C1CD44DD9517238C1EC060158D55710 +77DF077BDF35E9F96D07FD114FDF30F09FA0480322336275E9B3AF676603DD10 +75D4E9AE727889BD3E313A3F86C6784469D653AFFCE950990DDD65879506E8D9 +A4BBAE3A41D6C269F3A35EFF60E4F0EEA6290C29B81F2BDBB0E33A7B094DAA0C +EAC603058FA886F40CAEBEF24DA460D2DD891B7C12290235ABD082879EAADB6C +58291BFF83500EDC255D3FEDDE3E7F1EA5A055EEBECC18679368B17D03053732 +710C58F086B66F254D3CF734A377BF1C8884CC483D42A49E353230DE9B496300 +E388E1C3020C8D70657897350074D51D491C23F69CA20990DB6DB24297CA072B +1ED9AC18A9D2EBBE141937DA9148B49351B9225AA10B6A8941B5EC833FE9A457 +649EB68FC795C2929ACE8F3A566016EB4518B5BB55223C56908D00190B91C695 +FC183D9862573936A1BAEE758FC074C281C5E73045544E948250976ADCF97B0A +34CDEB2C05E62B32618236B698CC94AC3A4A317418D71FC85EC79FB2509EB76F +0E4A9E09EDF79ECD722B0E9033629DD7F976E768EDF05280665EF818709CD03E +3D9E79AB45D942B9FEF5584B7BB192CF574D80B98A926B4F698A53729A2E9F48 +3192075771433B7C0242127F5359BFE356BFC6FFAE3F78B8847CCDF6FDF6441C +49580453348C3757813E09D6447ACCA150D05B2517EEB2826767AF869E3EB7BD +D5CD1BC4DA45209CEE3741077B867A4CC52A1BB8951BB838D25533CFCDB459D2 +80F5A7FEDE77636CB5C512B122351D66281E14E3B80BF84833670981EE2E73BB +70F5788DC8A943B96ADDB8EB1B2114FEAD89B38A2C744A0D360F0AFD47FC5B23 +C55EE2DEECDEB212084475B5BDA5A6EBAB7EFDFB389FDCC9861FAB518DF6630A +000522A93907CD055E275EA7284D7166FB93CAD9D90144E7C1BB169635891556 +5CD2BC172EDCAB3B4263CC42BF0F0F3DE6E35BBF0E7FC62FCA92A5E74115C74B +9557D5319652129289AC3912140A010FF60E4F3891281267FC6D80E528A90D2B +D843F19E40B054C6886A8801C723C436F833564C1BD4DC92AB40D6337272DF53 +3F40275C0501DEF779F89BBA03CCC31161385D86D27A2532520244087B056868 +2EBE0FA551BA338FCC1E16306C071BF1711D3C675C85E08AF64D3E1A6F633B9F +44FBDC2E7209B2CCDFC5C7B61D13ED4186F3405999E2A840B22E21F97F410C09 +581A93B11B7C2D887EBBD65A45527D193977CA207CDFA88357F0BBE6DAC094C1 +081FC2E3C0FE8633AA852A913979718608E3AE200B999AB696CF21721E5D9BED +C8C6C97F485556EF3B80A36F8BBF181B5D04475459C73A951D99890E6B33FE4A +C93A20B15FF0A4F55A6C5E200BE986C823D331FAC69FA0EEA6888B325D934B6D +6B55560E4B3D74BE72CAEE1D03A79A64973459D32AFDF167105655C6B17F0BA8 +298D4D1BC7D7918D142EFDC0657D48C426D06553C2232D9A51B635530692B973 +CB475B3DD96750CF7B0B593A50B2A3CD370C9A38C8A229C21BD86A0981E3D11D +6E29164B01D2776DE681BD49D6EDF45C5D9D4B0D31E19383297331F146ECDC40 +DF77A89E1B3EF3A631595239A93D78F1FE0B0E04C9FE4EEE83E6AF5FA7D5CEDE +0B9883ACD1F1CC0659770D6B31500D247D417D860927ED7416C414FB7418216D +57E66624DB53FB344E1AC26100DACFDE01C026B84FA15B82CB77E9A0E37AF526 +A76D130C953928B764606B6C168A7BA484F904D46930A8273A61741F1C0EBB2F +8FCBB549DE3953876E3C2FB45940F1A98E5195EEA4FAC35EA66BD06F8861FEF5 +D0DA9E93B48DE54CA18F851DB7890DBE364E1D93527E4ADC15716A976274A264 +37F008707D590E6755A56F2DD9BA242B171931AD5BB6F24648A38FF1A3ADCADF +A156478D8C9DC9A1BFA553D707E94239252DF6E83FC3DB1D144F296FAFF4981B +C3052DB8D75FD0F74448D936036846AAD5F34B7C385D55F39B8368F184463578 +207CCABA7556D9A43C972BAA26CAA3BF0A82E0877D4D530CB350AFF88D920160 +88D937E0040F69FAECB44060A4E7B151ACD3AD46A659B8AF23EECE07E9029D01 +F77E7BE0A2783281141A8B7A13E013AE5A6BA5D20FC6D6A49473DFBF6E51C952 +D88EBA809ABF4313CA76381CA315858BB7EC4FEEA9C2864EA769F786E15CE30B +57E8DE5EBD70ABB189D5AB67310C9FFF2BB0D733014148A3084C2E4941AD1360 +0B5E23B6C4462BD69864844955619A25F540 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -5177,55 +4312,924 @@ AE5400775223E684BFCB 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 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 +3[39 97[{}13 74.7198 /CMSLTT10 rf /Fd 130[39 39 39 39 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 1[39 39 +39 39 39 39 39 39 39 39 39 1[39 39 39 1[39 2[39 39 39 +39 39 1[39 1[39 1[39 2[39 39 39 39 39 39 39 39 39 2[39 +39 39 39 39 3[39 1[39 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 /Fe +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 /Ff +214[35 35 40[{}2 90.9091 /CMSS10 rf /Fg 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 /Fh 134[48 48 48 +1[48 48 48 48 2[48 48 1[48 2[48 1[48 48 48 48 49[48 48 +49[{}17 90.9091 /CMSLTT10 rf /Fi 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 +/Fj 134[48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 +1[25 51 45 28 40 51 40 51 45 3[25 1[25 40[45 45 6[45 +29[51 53 11[{}31 90.9091 /CMSL10 rf /Fk 138[56 1[42 4[56 +4[27 1[58 3[54 1[56 97[{}7 90.9091 /CMCSC10 rf /Fl 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 /Fm 242[91 13[{}1 90.9091 /CMSY10 rf /Fn 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 /Fo 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 2[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[{}72 90.9091 /CMTT10 rf /Fp 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 /Fq 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 /Fr +156[37 10[62 3[60 46 2[57 1[62 76 52 1[43 1[62 65 54 +1[63 60 67[{}14 83.022 /CMR10 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi @@ -5239,755 +5243,816 @@ ifelse 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 +TeXDict begin 1 0 bop 316 83 a Fr(c)150 1112 y Fq(GNU)65 +b(History)h(Library)p 150 1212 3600 34 v 1920 1308 a +Fp(Edition)31 b(8.3,)h(for)e Fo(History)e(Library)h Fp(V)-8 +b(ersion)31 b(8.3.)3145 1416 y(Decem)m(b)s(er)g(2024)150 +4927 y Fn(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 +TeXDict begin 2 1 bop 150 4413 a Fp(This)30 b(do)s(cumen)m(t)g(describ) +s(es)f(the)i(GNU)g(History)g(library)f(\(v)m(ersion)h(8.3,)h(30)f +(Decem)m(b)s(er)h(2024\),)g(a)f(pro-)150 4523 y(gramming)23 +b(to)s(ol)g(that)g(pro)m(vides)f(a)h(consisten)m(t)h(user)d(in)m +(terface)j(for)e(recalling)i(lines)f(of)f(previously)g(t)m(yp)s(ed)150 +4633 y(input.)150 4767 y(Cop)m(yrigh)m(t)602 4764 y(c)577 +4767 y Fm(\015)30 b Fp(1988{2025)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 +TeXDict begin -1 2 bop 3725 -116 a Fp(i)150 299 y Fl(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 +TeXDict begin 1 3 bop 3705 -116 a Fp(1)150 299 y Fl(1)80 +b(Using)53 b(History)g(In)l(teractiv)l(ely)150 508 y +Fp(This)42 b(c)m(hapter)h(describ)s(es)f(ho)m(w)g(to)h(use)g(the)f +Fk(gnu)h Fp(History)g(Library)e(in)m(teractiv)m(ely)-8 +b(,)50 b(from)42 b(a)h(user's)150 618 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 +b(F)-8 b(or)43 b(information)f(on)g(using)g(the)g Fk(gnu)150 +728 y Fp(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 +837 y(page)31 b(4.)150 1068 y Fn(1.1)68 b(History)46 +b(Expansion)150 1227 y Fp(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 +(history)150 1337 y(expansion)d(pro)m(vided)g(b)m(y)g +Fo(csh)g Fp(\(also)h(referred)f(to)h(as)f(history)h(substitution)e +(where)h(appropriate\).)150 1447 y(This)30 b(section)h(describ)s(es)f +(the)g(syn)m(tax)h(used)f(to)h(manipulate)g(the)f(history)h +(information.)275 1576 y(History)g(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 1686 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 1795 y(input)f(line,)i(or)g(\014x)f(errors)f(in)h +(previous)g(commands)g(quic)m(kly)-8 b(.)275 1925 y(History)33 +b(expansion)f(tak)m(es)i(place)f(in)g(t)m(w)m(o)g(parts.)47 +b(The)32 b(\014rst)g(is)h(to)g(determine)f(whic)m(h)h(en)m(try)f(from) +150 2034 y(the)d(history)g(list)g(should)f(b)s(e)g(used)g(during)g +(substitution.)40 b(The)28 b(second)h(is)g(to)h(select)g(p)s(ortions)e +(of)h(that)150 2144 y(en)m(try)i(to)g(include)f(in)m(to)h(the)g(curren) +m(t)f(one.)275 2274 y(The)k(en)m(try)h(selected)h(from)e(the)h(history) +g(is)f(called)i(the)f Fj(ev)m(en)m(t)p Fp(,)j(and)c(the)g(p)s(ortions)h +(of)f(that)i(en)m(try)150 2383 y(that)d(are)g(acted)g(up)s(on)e(are)i +Fj(w)m(ords)p Fp(.)46 b(V)-8 b(arious)33 b Fj(mo)s(di\014ers)i +Fp(are)d(a)m(v)-5 b(ailable)35 b(to)e(manipulate)g(the)f(selected)150 +2493 y(w)m(ords.)38 b(The)24 b(en)m(try)h(is)g(split)g(in)m(to)g(w)m +(ords)f(in)h(the)g(same)g(fashion)f(that)h(Bash)g(do)s(es)f(when)g +(reading)h(input,)150 2602 y(so)k(that)h(sev)m(eral)g(w)m(ords)f +(surrounded)d(b)m(y)j(quotes)h(are)f(considered)g(one)g(w)m(ord.)40 +b(The)29 b Fj(ev)m(en)m(t)h(designator)150 2712 y Fp(selects)37 +b(the)f(ev)m(en)m(t,)j(the)d(optional)h Fj(w)m(ord)f(designator)43 +b Fp(selects)37 b(w)m(ords)e(from)h(the)g(ev)m(en)m(t,)j(and)c(v)-5 +b(arious)150 2822 y(optional)32 b Fj(mo)s(di\014ers)g +Fp(are)f(a)m(v)-5 b(ailable)33 b(to)e(manipulate)g(the)f(selected)i(w)m +(ords.)275 2951 y(History)26 b(expansions)f(are)h(in)m(tro)s(duced)f(b) +m(y)g(the)g(app)s(earance)h(of)g(the)f(history)h(expansion)f(c)m +(haracter,)150 3061 y(whic)m(h)31 b(is)g(`)p Fo(!)p Fp(')h(b)m(y)f +(default.)43 b(History)32 b(expansions)f(ma)m(y)g(app)s(ear)g(an)m +(ywhere)g(in)g(the)g(input,)g(but)g(do)g(not)150 3170 +y(nest.)275 3300 y(History)26 b(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 +(b)s(e)g(used)f(to)150 3409 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 +(enclose)g(v)m(erbatim)g(sequences)150 3519 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) +(c)m(haracters)i(enclosed)e(within)150 3629 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 +(kslash)g(can)h(escap)s(e)f(the)g(history)150 3738 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 +(are)g(not)f(treated)i(sp)s(ecially)f(within)150 3848 +y(double)g(quotes.)275 3977 y(There)25 b(is)h(a)h(sp)s(ecial)f +(abbreviation)h(for)f(substitution,)g(activ)m(e)j(when)c(the)h +Fj(quic)m(k)h(substitution)e Fp(c)m(har-)150 4087 y(acter)k(\(default)f +(`)p Fo(^)p Fp('\))h(is)f(the)g(\014rst)f(c)m(haracter)i(on)f(the)g +(line.)40 b(It)28 b(selects)h(the)f(previous)g(history)g(list)g(en)m +(try)-8 b(,)150 4197 y(using)34 b(an)g(ev)m(en)m(t)h(designator)g +(equiv)-5 b(alen)m(t)36 b(to)f Fo(!!)p Fp(,)f(and)g(substitutes)g(one)g +(string)g(for)g(another)h(in)e(that)150 4306 y(en)m(try)-8 +b(.)40 b(It)27 b(is)g(describ)s(ed)f(b)s(elo)m(w)h(\(see)g(Section)h +(1.1.1)h([Ev)m(en)m(t)f(Designators],)h(page)f(1\).)40 +b(This)26 b(is)h(the)g(only)150 4416 y(history)j(expansion)h(that)g(do) +s(es)f(not)g(b)s(egin)g(with)g(the)h(history)f(expansion)g(c)m +(haracter.)150 4605 y Fi(1.1.1)63 b(Ev)m(en)m(t)39 b(Designators)150 +4752 y Fp(An)g(ev)m(en)m(t)i(designator)f(is)g(a)g(reference)f(to)i(an) +e(en)m(try)h(in)f(the)g(history)h(list.)68 b(The)39 b(ev)m(en)m(t)i +(designator)150 4862 y(consists)f(of)g(the)f(p)s(ortion)h(of)f(the)h(w) +m(ord)f(b)s(eginning)g(with)g(the)h(history)f(expansion)h(c)m +(haracter,)k(and)150 4971 y(ending)e(with)g(the)h(w)m(ord)f(designator) +i(if)e(one)h(is)g(presen)m(t,)j(or)c(the)h(end)f(of)h(the)f(w)m(ord.)77 +b(Unless)43 b(the)150 5081 y(reference)31 b(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 5230 y Fo(!)432 b Fp(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 +e(a)h(space,)h(tab,)f(the)g(end)f(of)630 5340 y(the)e(line,)g(or)f(`)p +Fo(=)p Fp('.)p eop end %%Page: 2 5 -TeXDict begin 2 4 bop 150 -116 a Fq(Chapter)30 b(1:)41 +TeXDict begin 2 4 bop 150 -116 a Fp(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 +299 y Fo(!)p Fh(n)384 b Fp(Refer)30 b(to)i(history)e(list)h(en)m(try)f +Fj(n)p Fp(.)150 450 y Fo(!-)p Fh(n)336 b Fp(Refer)30 +b(to)i(the)e(history)g(en)m(try)h(min)m(us)f Fj(n)p Fp(.)150 +602 y Fo(!!)384 b Fp(Refer)30 b(to)i(the)e(previous)g(en)m(try)-8 +b(.)41 b(This)30 b(is)g(a)h(synon)m(ym)f(for)g(`)p Fo(!-1)p +Fp('.)150 753 y Fo(!)p Fh(string)144 b Fp(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 863 y(list)31 b(starting)g(with)f +Fj(string)p Fp(.)150 1014 y Fo(!?)p Fh(string)p Fo([?])630 +1124 y Fp(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 +1233 y(list)32 b(con)m(taining)i Fj(string)p Fp(.)45 +b(The)31 b(trailing)i(`)p Fo(?)p Fp(')f(ma)m(y)g(b)s(e)f(omitted)i(if)f +(the)g Fj(string)39 b Fp(is)32 b(follo)m(w)m(ed)630 1343 +y(immediately)39 b(b)m(y)f(a)g(newline.)63 b(If)37 b +Fj(string)45 b Fp(is)38 b(missing,)i(this)e(uses)f(the)h(string)f(from) +h(the)630 1452 y(most)31 b(recen)m(t)g(searc)m(h;)g(it)g(is)g(an)f +(error)g(if)g(there)h(is)f(no)h(previous)e(searc)m(h)i(string.)150 +1604 y Fo(^)p Fh(string1)p Fo(^)p Fh(string2)p Fo(^)630 +1713 y Fp(Quic)m(k)h(Substitution.)44 b(Rep)s(eat)32 +b(the)g(last)h(command,)f(replacing)g Fj(string1)40 b +Fp(with)31 b Fj(string2)p Fp(.)630 1823 y(Equiv)-5 b(alen)m(t)31 +b(to)g Fo(!!:s^)p Fh(string1)p Fo(^)p Fh(string2)p Fo(^)p +Fp(.)150 1974 y Fo(!#)384 b Fp(The)30 b(en)m(tire)h(command)f(line)h(t) +m(yp)s(ed)f(so)h(far.)150 2166 y Fi(1.1.2)63 b(W)-10 +b(ord)41 b(Designators)150 2313 y Fp(W)-8 b(ord)28 b(designators)h(are) +f(used)f(to)i(select)h(desired)d(w)m(ords)h(from)f(the)h(ev)m(en)m(t.) +42 b(They)27 b(are)i(optional;)h(if)e(the)150 2422 y(w)m(ord)h +(designator)i(isn't)e(supplied,)g(the)h(history)g(expansion)f(uses)g +(the)h(en)m(tire)h(ev)m(en)m(t.)42 b(A)29 b(`)p Fo(:)p +Fp(')h(separates)150 2532 y(the)f(ev)m(en)m(t)i(sp)s(eci\014cation)e +(from)g(the)g(w)m(ord)g(designator.)41 b(It)29 b(ma)m(y)g(b)s(e)g +(omitted)h(if)e(the)i(w)m(ord)e(designator)150 2641 y(b)s(egins)33 +b(with)h(a)h(`)p Fo(^)p Fp(',)g(`)p Fo($)p Fp(',)g(`)p +Fo(*)p Fp(',)h(`)p Fo(-)p Fp(',)f(or)f(`)p Fo(\045)p +Fp('.)52 b(W)-8 b(ords)35 b(are)f(n)m(um)m(b)s(ered)f(from)g(the)i(b)s +(eginning)e(of)h(the)g(line,)150 2751 y(with)39 b(the)h(\014rst)e(w)m +(ord)h(b)s(eing)g(denoted)g(b)m(y)h(0)f(\(zero\).)69 +b(That)40 b(\014rst)e(w)m(ord)h(is)h(usually)f(the)g(command)150 +2861 y(w)m(ord,)31 b(and)f(the)h(argumen)m(ts)g(b)s(egin)f(with)g(the)h +(second)g(w)m(ord.)41 b(W)-8 b(ords)31 b(are)g(inserted)g(in)m(to)g +(the)g(curren)m(t)150 2970 y(line)g(separated)g(b)m(y)f(single)h +(spaces.)275 3101 y(F)-8 b(or)31 b(example,)150 3252 +y Fo(!!)384 b Fp(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 +3362 y(mand)30 b(is)g(rep)s(eated)g(in)g(toto.)150 3513 +y Fo(!!:$)288 b Fp(designates)30 b(the)g(last)g(w)m(ord)f(of)g(the)h +(preceding)f(command.)40 b(This)29 b(ma)m(y)h(b)s(e)e(shortened)h(to) +630 3623 y Fo(!$)p Fp(.)150 3774 y Fo(!fi:2)240 b Fp(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 3884 y(letters)j Fo(fi)p Fp(.)275 +4035 y(Here)e(are)h(the)g(w)m(ord)f(designators:)150 +4186 y Fo(0)g(\(zero\))114 b Fp(The)24 b Fo(0)p Fp(th)g(w)m(ord.)38 +b(F)-8 b(or)25 b(the)g(shell,)h(and)d(man)m(y)i(other,)h(applications,) +h(this)d(is)h(the)f(command)630 4296 y(w)m(ord.)150 4447 +y Fh(n)432 b Fp(The)30 b Fj(n)p Fp(th)g(w)m(ord.)150 +4599 y Fo(^)432 b Fp(The)30 b(\014rst)f(argumen)m(t:)42 +b(w)m(ord)30 b(1.)150 4750 y Fo($)432 b Fp(The)36 b(last)i(w)m(ord.)59 +b(This)36 b(is)h(usually)f(the)h(last)g(argumen)m(t,)i(but)d(expands)g +(to)h(the)g(zeroth)630 4860 y(w)m(ord)30 b(if)g(there)h(is)f(only)h +(one)f(w)m(ord)g(in)h(the)f(line.)150 5011 y Fo(\045)432 +b Fp(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 Fo(?)p Fh(string)p Fo(?)p Fp(')d(searc)m(h,)44 +b(if)d(the)g(searc)m(h)630 5121 y(string)25 b(b)s(egins)g(with)g(a)h(c) +m(haracter)h(that)f(is)g(part)f(of)h(a)g(w)m(ord.)38 +b(By)26 b(default,)h(searc)m(hes)f(b)s(egin)630 5230 +y(at)j(the)e(end)h(of)g(eac)m(h)h(line)f(and)f(pro)s(ceed)g(to)i(the)f +(b)s(eginning,)g(so)g(the)g(\014rst)f(w)m(ord)g(matc)m(hed)630 +5340 y(is)j(the)h(one)g(closest)h(to)f(the)f(end)g(of)g(the)h(line.)p +eop end %%Page: 3 6 -TeXDict begin 3 5 bop 150 -116 a Fq(Chapter)30 b(1:)41 +TeXDict begin 3 5 bop 150 -116 a Fp(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 +299 y Fh(x)p Fo(-)p Fh(y)336 b Fp(A)30 b(range)h(of)g(w)m(ords;)f(`)p +Fo(-)p Fh(y)p Fp(')g(abbreviates)h(`)p Fo(0-)p Fh(y)p +Fp('.)150 458 y Fo(*)432 b Fp(All)28 b(of)g(the)g(w)m(ords,)g(except)h +(the)e Fo(0)p Fp(th.)40 b(This)27 b(is)g(a)h(synon)m(ym)f(for)h(`)p +Fo(1-$)p Fp('.)39 b(It)28 b(is)g(not)g(an)f(error)630 +568 y(to)k(use)f(`)p Fo(*)p Fp(')h(if)f(there)h(is)f(just)g(one)h(w)m +(ord)f(in)g(the)h(ev)m(en)m(t;)h(it)f(expands)e(to)j(the)e(empt)m(y)h +(string)630 677 y(in)f(that)h(case.)150 837 y Fh(x)p +Fo(*)384 b Fp(Abbreviates)31 b(`)p Fh(x)p Fo(-$)p Fp('.)150 +996 y Fh(x)p Fo(-)384 b Fp(Abbreviates)27 b(`)p Fh(x)p +Fo(-$)p Fp(')g(lik)m(e)h(`)p Fh(x)p Fo(*)p Fp(',)g(but)e(omits)i(the)f +(last)h(w)m(ord.)39 b(If)27 b(`)p Fo(x)p Fp(')g(is)g(missing,)g(it)h +(defaults)630 1106 y(to)j(0.)275 1265 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 1375 y(is)d(used)g(as)h(the)f(ev)m(en)m +(t,)i(equiv)-5 b(alen)m(t)32 b(to)f Fo(!!)p Fp(.)150 +1574 y Fi(1.1.3)63 b(Mo)s(di\014ers)150 1721 y Fp(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 +1831 y(mo)s(di\014ers,)33 b(eac)m(h)h(preceded)f(b)m(y)g(a)h(`)p +Fo(:)p Fp('.)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 1940 y(the)d(history)f +(ev)m(en)m(t.)150 2100 y Fo(h)432 b Fp(Remo)m(v)m(e)32 +b(a)f(trailing)g(\014lename)g(comp)s(onen)m(t,)g(lea)m(ving)h(only)e +(the)h(head.)150 2259 y Fo(t)432 b Fp(Remo)m(v)m(e)32 +b(all)f(leading)h(\014lename)e(comp)s(onen)m(ts,)h(lea)m(ving)h(the)f +(tail.)150 2418 y Fo(r)432 b Fp(Remo)m(v)m(e)32 b(a)f(trailing)g +(su\016x)f(of)g(the)h(form)f(`)p Fo(.)p Fh(suffix)p Fp(',)f(lea)m(ving) +j(the)f(basename.)150 2578 y Fo(e)432 b Fp(Remo)m(v)m(e)32 +b(all)f(but)f(the)h(trailing)g(su\016x.)150 2737 y Fo(p)432 +b Fp(Prin)m(t)30 b(the)h(new)f(command)g(but)g(do)g(not)g(execute)i +(it.)150 2897 y Fo(s/)p Fh(old)p Fo(/)p Fh(new)p Fo(/)630 +3006 y Fp(Substitute)f Fj(new)39 b Fp(for)32 b(the)g(\014rst)f(o)s +(ccurrence)h(of)f Fj(old)36 b Fp(in)31 b(the)h(ev)m(en)m(t)h(line.)46 +b(An)m(y)31 b(c)m(haracter)630 3116 y(ma)m(y)k(b)s(e)e(used)h(as)g(the) +h(delimiter)g(in)f(place)h(of)f(`)p Fo(/)p Fp('.)53 b(The)33 +b(delimiter)i(ma)m(y)g(b)s(e)f(quoted)g(in)630 3225 y +Fj(old)i Fp(and)31 b Fj(new)39 b Fp(with)31 b(a)i(single)f(bac)m +(kslash.)46 b(If)31 b(`)p Fo(&)p Fp(')h(app)s(ears)f(in)h +Fj(new)p Fp(,)g(it)g(is)g(replaced)g(with)630 3335 y +Fj(old)p Fp(.)41 b(A)30 b(single)h(bac)m(kslash)g(quotes)g(the)f(`)p +Fo(&)p Fp(')h(in)f Fj(old)k Fp(and)29 b Fj(new)p Fp(.)41 +b(If)29 b Fj(old)34 b Fp(is)d(n)m(ull,)f(it)h(is)f(set)h(to)630 +3445 y(the)f(last)g Fj(old)j Fp(substituted,)c(or,)h(if)f(no)g +(previous)g(history)g(substitutions)g(to)s(ok)h(place,)h(the)630 +3554 y(last)e Fj(string)36 b Fp(in)28 b(a)h(!?)p Fj(string)8 +b Fo([?])28 b Fp(searc)m(h.)40 b(If)28 b Fj(new)36 b +Fp(is)28 b(n)m(ull,)h(eac)m(h)h(matc)m(hing)f Fj(old)j +Fp(is)d(deleted.)630 3664 y(The)h(\014nal)g(delimiter)h(is)f(optional)i +(if)e(it)h(is)g(the)f(last)h(c)m(haracter)h(on)f(the)f(input)g(line.) +150 3823 y Fo(&)432 b Fp(Rep)s(eat)31 b(the)f(previous)g(substitution.) +150 3983 y Fo(g)150 4092 y(a)432 b Fp(Cause)27 b(c)m(hanges)i(to)f(b)s +(e)f(applied)g(o)m(v)m(er)h(the)g(en)m(tire)g(ev)m(en)m(t)h(line.)40 +b(This)27 b(is)g(used)g(in)g(conjunc-)630 4202 y(tion)k(with)f(`)p +Fo(s)p Fp(',)h(as)f(in)g Fo(gs/)p Fh(old)p Fo(/)p Fh(new)p +Fo(/)p Fp(,)e(or)i(with)g(`)p Fo(&)p Fp('.)150 4361 y +Fo(G)432 b Fp(Apply)30 b(the)g(follo)m(wing)i(`)p Fo(s)p +Fp(')f(or)f(`)p Fo(&)p Fp(')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 +TeXDict begin 4 6 bop 3705 -116 a Fp(4)150 299 y Fl(2)80 +b(Programming)54 b(with)f(GNU)h(History)150 544 y Fp(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 +(that)g(y)m(ou)h(write)f(with)f(the)i Fk(gnu)e Fp(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 +m(teractiv)m(e)i(use)150 763 y(of)c Fk(gnu)f Fp(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 +(page)e(1.)150 1010 y Fn(2.1)68 b(In)l(tro)t(duction)45 +b(to)g(History)150 1169 y Fp(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 +b Fk(gnu)g Fp(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 +(information)150 1388 y(from)g(previous)g(lines)g(when)g(comp)s(osing)g +(new)g(ones.)275 1527 y(A)23 b(programmer)f(using)h(the)g(History)h +(library)e(can)h(use)g(functions)g(to)g(sa)m(v)m(e)i(commands)e(on)g(a) +g(history)150 1636 y(list,)37 b(asso)s(ciate)h(arbitrary)d(data)h(with) +f(history)g(list)h(en)m(tries,)i(remo)m(v)m(e)e(en)m(tries)g(from)f +(the)h(list,)h(searc)m(h)150 1746 y(through)g(the)h(list)g(for)f(a)h +(line)g(con)m(taining)h(an)e(arbitrary)h(text)g(string,)i(reference)e +(an)m(y)g(en)m(try)g(in)f(the)150 1855 y(list)e(directly)-8 +b(,)38 b(and)c(read)h(and)f(write)h(the)g(history)g(list)g(from)f(and)h +(to)g(a)g(\014le.)54 b(In)34 b(addition,)j(a)e(history)150 +1965 y Fj(expansion)25 b Fp(function)g(is)h(a)m(v)-5 +b(ailable)28 b(whic)m(h)d(pro)m(vides)g(for)g(a)h(consisten)m(t)h(user) +e(in)m(terface)h(across)g(di\013eren)m(t)150 2075 y(programs.)275 +2213 y(Someone)i(using)f(programs)g(written)h(with)g(the)g(History)g +(library)f(has)h(the)g(b)s(ene\014t)f(of)g(a)i(consisten)m(t)150 +2323 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 +2432 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 +2542 y(similar)j(to)g(the)f(history)h(substitution)f(pro)m(vided)g(b)m +(y)g Fo(csh)p Fp(.)275 2680 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 2790 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 2928 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 +3037 y(other)29 b(co)s(de,)g(an)g(application)h(writer)f(should)e +(include)i(the)g(\014le)f Fo()23 +b Fp(in)29 b(an)m(y)g(\014le)150 3147 y(that)c(uses)f(the)h(History)g +(library's)f(features.)39 b(It)25 b(supplies)e(declarations)j(for)f +(all)g(of)g(the)f(library's)h(public)150 3257 y(functions)30 +b(and)g(v)-5 b(ariables,)31 b(and)f(declares)h(all)g(of)g(the)f(public) +g(data)h(structures.)150 3503 y Fn(2.2)68 b(History)46 +b(Storage)150 3662 y Fp(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 3801 y Fo(typedef)46 +b(void)g(*histdata_t;)390 4020 y(typedef)g(struct)g(_hist_entry)f({)485 +4129 y(char)i(*line;)485 4239 y(char)g(*timestamp;)485 +4349 y(histdata_t)e(data;)390 4458 y(})i(HIST_ENTRY;)275 +4596 y Fp(The)29 b(history)i(list)g(itself)g(migh)m(t)g(therefore)g(b)s +(e)f(declared)g(as)390 4735 y Fo(HIST_ENTRY)45 b(**the_history_list;) +275 4873 y Fp(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 +5011 y Fo(/*)438 5121 y(*)47 b(A)h(structure)d(used)i(to)g(pass)f (around)g(the)h(current)f(state)h(of)g(the)g(history.)438 -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 +5230 y(*/)390 5340 y(typedef)f(struct)g(_hist_state)f({)p +eop end %%Page: 5 8 -TeXDict begin 5 7 bop 150 -116 a Fq(Chapter)30 b(2:)41 +TeXDict begin 5 7 bop 150 -116 a Fp(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 +299 y Fo(HIST_ENTRY)45 b(**entries;)g(/*)j(Pointer)d(to)j(the)f +(entries)e(themselves.)g(*/)485 408 y(int)i(offset;)523 +b(/*)48 b(The)f(location)e(pointer)h(within)g(this)h(array.)f(*/)485 +518 y(int)h(length;)523 b(/*)48 b(Number)e(of)h(elements)e(within)i +(this)f(array.)g(*/)485 628 y(int)h(size;)619 b(/*)48 +b(Number)e(of)h(slots)f(allocated)g(to)h(this)f(array.)g(*/)485 +737 y(int)h(flags;)390 847 y(})g(HISTORY_STATE;)275 978 +y Fp(If)c(the)h(\015ags)h(mem)m(b)s(er)e(includes)h Fo(HS_STIFLED)p +Fp(,)h(the)f(history)g(has)g(b)s(een)g(sti\015ed)g(\(limited)h(to)g(a) +150 1087 y(maxim)m(um)30 b(n)m(um)m(b)s(er)f(of)i(en)m(tries\).)150 +1320 y Fn(2.3)68 b(History)46 b(F)-11 b(unctions)150 +1480 y Fp(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 +Fk(gnu)150 1589 y Fp(History)d(library)-8 b(.)150 1781 +y Fi(2.3.1)63 b(Initializing)40 b(History)i(and)f(State)f(Managemen)m +(t)150 1928 y Fp(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 2037 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 2210 +y([F)-8 b(unction])-3599 b Fg(void)54 b(using_history)49 +b Ff(\()p Fe(v)m(oid)p Ff(\))390 2320 y Fp(Begin)40 b(a)g(session)g +(that)g(will)g(use)f(the)g(history)h(functions.)67 b(This)39 +b(initializes)i(the)f(in)m(teractiv)m(e)390 2430 y(v)-5 +b(ariables.)3350 2603 y([F)d(unction])-3599 b Fg(HISTORY_STATE)56 +b(*)d(history_get_history_st)q(ate)f Ff(\()p Fe(v)m(oid)p +Ff(\))390 2712 y Fp(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 +2885 y([F)g(unction])-3599 b Fg(void)54 b(history_set_history_stat)q(e) +e Ff(\()p Fe(HISTOR)-8 b(Y)p 2262 2885 30 5 v 44 w(ST)g(A)g(TE)32 +b(*state)p Ff(\))390 2995 y Fp(Set)f(the)f(state)i(of)e(the)h(history)f +(list)h(according)h(to)f Fj(state)p Fp(.)150 3186 y Fi(2.3.2)63 +b(History)41 b(List)g(Managemen)m(t)150 3333 y Fp(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 +(list,)h(or)f(set)h(parameters)f(managing)150 3443 y(the)f(list)g +(itself.)3350 3616 y([F)-8 b(unction])-3599 b Fg(void)54 +b(add_history)48 b Ff(\()p Fe(const)34 b(c)m(har)g(*string)p +Ff(\))390 3725 y Fp(Add)i Fj(string)44 b Fp(to)38 b(the)f(end)f(of)h +(the)g(history)f(list,)k(and)c(set)h(the)g(asso)s(ciated)h(data)g +(\014eld)e(\(if)h(an)m(y\))390 3835 y(to)44 b Fo(NULL)p +Fp(.)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 Fo(stifle_)390 +3944 y(history\(\))p Fp(,)26 b(and)i(the)g(new)g(n)m(um)m(b)s(er)e(of)j +(history)f(en)m(tries)h(w)m(ould)f(exceed)h(that)f(maxim)m(um,)h(this) +390 4054 y(remo)m(v)m(es)j(the)e(oldest)h(history)g(en)m(try)-8 +b(.)3350 4227 y([F)g(unction])-3599 b Fg(void)54 b(add_history_time)c +Ff(\()p Fe(const)34 b(c)m(har)g(*string)p Ff(\))390 4337 +y Fp(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 Fj(string)p Fp(.)3350 +4510 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)55 b(*)e(remove_history)d +Ff(\()p Fe(in)m(t)33 b(whic)m(h)p Ff(\))390 4619 y Fp(Remo)m(v)m(e)45 +b(the)e(history)h(en)m(try)f(at)h(o\013set)g Fj(whic)m(h)f +Fp(from)g(the)g(history)g(list.)80 b(This)43 b(returns)f(the)390 +4729 y(remo)m(v)m(ed)34 b(elemen)m(t)h(so)f(y)m(ou)f(can)h(free)f(the)h +(line,)g(data,)h(and)e(con)m(taining)i(structure.)48 +b(Since)34 b(the)390 4838 y(data)29 b(is)f(priv)-5 b(ate)29 +b(to)g(y)m(our)f(application,)i(the)e(History)h(library)f(do)s(esn't)g +(kno)m(w)g(ho)m(w)g(to)h(free)g(it,)g(if)390 4948 y(necessary)-8 +b(.)3350 5121 y([F)g(unction])-3599 b Fg(histdata_t)55 +b(free_history_entry)c Ff(\()p Fe(HIST)p 1992 5121 V +44 w(ENTR)-8 b(Y)33 b(*histen)m(t)p Ff(\))390 5230 y +Fp(F)-8 b(ree)29 b(the)f(history)g(en)m(try)g Fj(histen)m(t)j +Fp(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 +TeXDict begin 6 8 bop 150 -116 a Fp(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 +299 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)55 b(*)e +(replace_history_entry)f Ff(\()p Fe(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 +w(t)f(data)p Ff(\))390 518 y Fp(Mak)m(e)c(the)f(history)f(en)m(try)h +(at)h(o\013set)f Fj(whic)m(h)g Fp(ha)m(v)m(e)g Fj(line)33 +b Fp(and)27 b Fj(data)p Fp(.)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 +(in)m(v)-5 b(alid)390 737 y Fj(whic)m(h)p Fp(,)30 b(this)h(returns)e +Fo(NULL)p Fp(.)3350 951 y([F)-8 b(unction])-3599 b Fg(void)54 +b(clear_history)49 b Ff(\()p Fe(v)m(oid)p Ff(\))390 1061 +y Fp(Clear)31 b(the)f(history)h(list)g(b)m(y)f(deleting)h(all)h(the)e +(en)m(tries.)3350 1275 y([F)-8 b(unction])-3599 b Fg(void)54 +b(stifle_history)49 b Ff(\()p Fe(in)m(t)34 b(max)p Ff(\))390 +1385 y Fp(Sti\015e)j(the)f(history)h(list,)i(remem)m(b)s(ering)d(only)h +(the)f(last)i Fj(max)43 b Fp(en)m(tries.)60 b(The)36 +b(history)g(list)i(will)390 1494 y(con)m(tain)32 b(only)e +Fj(max)37 b Fp(en)m(tries)31 b(at)g(a)g(time.)3350 1709 +y([F)-8 b(unction])-3599 b Fg(int)53 b(unstifle_history)e +Ff(\()p Fe(v)m(oid)p Ff(\))390 1818 y Fp(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 1928 y(en)m(tries)g(\(as)f +(set)g(b)m(y)g Fo(stifle_history\(\))p Fp(\).)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 2037 y(negativ)m(e)33 b(if)d(it)h(w)m(asn't.)3350 +2251 y([F)-8 b(unction])-3599 b Fg(int)53 b(history_is_stifled)e +Ff(\()p Fe(v)m(oid)p Ff(\))390 2361 y Fp(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 +2575 y Fi(2.3.3)63 b(Information)42 b(Ab)s(out)f(the)g(History)g(List) +150 2722 y Fp(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 +(tries.)3350 2936 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)55 +b(**)e(history_list)c Ff(\()p Fe(v)m(oid)p Ff(\))390 +3046 y Fp(Return)30 b(a)h Fo(NULL)e Fp(terminated)i(arra)m(y)g(of)f +Fo(HIST_ENTRY)e(*)i Fp(whic)m(h)g(is)h(the)g(curren)m(t)f(input)f +(history)-8 b(.)390 3156 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(Return)29 b Fo(NULL)g +Fp(if)i(there)f(is)h(no)f(history)-8 b(.)3350 3370 y([F)g(unction]) +-3599 b Fg(int)53 b(where_history)d Ff(\()p Fe(v)m(oid)p +Ff(\))390 3479 y Fp(Return)30 b(the)g(o\013set)i(of)e(the)h(curren)m(t) +f(history)g(en)m(try)-8 b(.)3350 3693 y([F)g(unction])-3599 +b Fg(HIST_ENTRY)55 b(*)e(current_history)d Ff(\()p Fe(v)m(oid)p +Ff(\))390 3803 y Fp(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 +Fo(where_history\(\))p Fp(.)390 3913 y(If)30 b(there)g(is)h(no)f(en)m +(try)h(there,)g(return)e Fo(NULL)p Fp(.)3350 4127 y([F)-8 +b(unction])-3599 b Fg(HIST_ENTRY)55 b(*)e(history_get)c +Ff(\()p Fe(in)m(t)33 b(o\013set)p Ff(\))390 4236 y Fp(Return)e(the)g +(history)h(en)m(try)g(at)g(p)s(osition)g Fj(o\013set)p +Fp(.)45 b(The)31 b(range)h(of)g(v)-5 b(alid)31 b(v)-5 +b(alues)32 b(of)g Fj(o\013set)j Fp(starts)390 4346 y(at)d +Fo(history_base)c Fp(and)i(ends)h(at)g Fj(history)p 1885 +4346 28 4 v 40 w(length)h Fp(-)f(1)h(\(see)g(Section)g(2.4)g([History)g +(V)-8 b(ariables],)390 4456 y(page)30 b(9\).)41 b(If)28 +b(there)i(is)f(no)g(en)m(try)g(there,)h(or)f(if)g Fj(o\013set)j +Fp(is)d(outside)g(the)h(v)-5 b(alid)29 b(range,)h(return)e +Fo(NULL)p Fp(.)3350 4670 y([F)-8 b(unction])-3599 b Fg(time_t)54 +b(history_get_time)c Ff(\()p Fe(HIST)p 1678 4670 30 5 +v 45 w(ENTR)-8 b(Y)32 b(*en)m(try)p Ff(\))390 4779 y +Fp(Return)g(the)i(time)g(stamp)f(asso)s(ciated)h(with)f(the)g(history)g +(en)m(try)h Fj(en)m(try)p Fp(.)49 b(If)33 b(the)g(timestamp)h(is)390 +4889 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 Fg(int)53 b(history_total_bytes)e +Ff(\()p Fe(v)m(oid)p Ff(\))390 5213 y Fp(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 +TeXDict begin 7 9 bop 150 -116 a Fp(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 +299 y Fi(2.3.4)63 b(Mo)m(ving)41 b(Around)h(the)f(History)g(List)150 +446 y Fp(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 +3350 611 y([F)-8 b(unction])-3599 b Fg(int)53 b(history_set_pos)d +Ff(\()p Fe(in)m(t)34 b(p)s(os)p Ff(\))390 721 y Fp(Set)j(the)g(curren)m +(t)f(history)g(o\013set)i(to)f Fj(p)s(os)p Fp(,)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 +830 y(success,)31 b(0)g(if)f Fj(p)s(os)j Fp(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) +(tries.)3350 996 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)55 +b(*)e(previous_history)d Ff(\()p Fe(v)m(oid)p Ff(\))390 +1106 y Fp(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 +s(oin)m(ter)390 1215 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(return)e Fo(NULL)p Fp(.)3350 1381 y([F)-8 b(unction])-3599 +b Fg(HIST_ENTRY)55 b(*)e(next_history)c Ff(\()p Fe(v)m(oid)p +Ff(\))390 1490 y Fp(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 +1600 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 1709 y(a)i(p)s(oin)m(ter)f +(to)h(that)g(en)m(try;)g(otherwise,)g(return)e Fo(NULL)p +Fp(.)150 1896 y Fi(2.3.5)63 b(Searc)m(hing)40 b(the)h(History)h(List) +150 2043 y Fp(These)23 b(functions)h(searc)m(h)g(the)g(history)g(list)g +(for)f(en)m(tries)i(con)m(taining)g(a)f(sp)s(eci\014c)g(string.)38 +b(Searc)m(hing)24 b(ma)m(y)150 2153 y(b)s(e)37 b(p)s(erformed)f(b)s +(oth)h(forw)m(ard)g(and)g(bac)m(kw)m(ard)h(from)f(the)h(curren)m(t)f +(history)h(p)s(osition.)62 b(The)37 b(searc)m(h)150 2262 +y(ma)m(y)28 b(b)s(e)f Fj(anc)m(hored)p Fp(,)h(meaning)g(that)g(the)g +(string)f(m)m(ust)h(matc)m(h)g(at)g(the)g(b)s(eginning)f(of)g(a)h +(history)g(en)m(try)-8 b(.)3350 2428 y([F)g(unction])-3599 +b Fg(int)53 b(history_search)d Ff(\()p Fe(const)34 b(c)m(har)g +(*string,)e(in)m(t)i(direction)p Ff(\))390 2537 y Fp(Searc)m(h)29 +b(the)g(history)g(for)g Fj(string)p Fp(,)g(starting)h(at)f(the)g +(curren)m(t)g(history)g(o\013set.)41 b(If)28 b Fj(direction)i +Fp(is)f(less)390 2647 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 2756 y(en)m(tries.)i(If)30 b Fj(string)38 b Fp(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 +(that)f(history)f(en)m(try)-8 b(,)390 2866 y(and)22 b +Fo(history_search)c Fp(returns)j(the)i(o\013set)g(in)f(the)h(line)g(of) +f(the)h(en)m(try)f(where)g Fj(string)30 b Fp(w)m(as)23 +b(found.)390 2976 y(Otherwise,)30 b(nothing)h(is)f(c)m(hanged,)h(and)f +(this)g(returns)f(-1.)3350 3141 y([F)-8 b(unction])-3599 +b Fg(int)53 b(history_search_prefix)f Ff(\()p Fe(const)34 +b(c)m(har)g(*string,)f(in)m(t)g(direction)p Ff(\))390 +3251 y Fp(Searc)m(h)41 b(the)g(history)f(for)g Fj(string)p +Fp(,)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 3360 y(anc)m(hored:)49 +b(matc)m(hing)36 b(history)e(en)m(tries)i(m)m(ust)e(b)s(egin)g(with)g +Fj(string)p Fp(.)54 b(If)34 b Fj(direction)h Fp(is)f(less)h(than)390 +3470 y(0,)d(then)e(the)h(searc)m(h)h(is)f(through)f(previous)g(en)m +(tries,)i(otherwise)g(through)e(subsequen)m(t)g(en)m(tries.)390 +3579 y(If)h Fj(string)40 b Fp(is)31 b(found,)g(then)h(the)g(curren)m(t) +f(history)h(index)f(is)h(set)g(to)h(that)f(en)m(try)-8 +b(,)33 b(and)e(the)h(return)390 3689 y(v)-5 b(alue)31 +b(is)f(0.)41 b(Otherwise,)31 b(nothing)f(is)g(c)m(hanged,)i(and)d(this) +i(returns)e(-1.)3350 3855 y([F)-8 b(unction])-3599 b +Fg(int)53 b(history_search_pos)e Ff(\()p Fe(const)34 +b(c)m(har)g(*string,)f(in)m(t)g(direction,)g(in)m(t)g(p)s(os)p +Ff(\))390 3964 y Fp(Searc)m(h)h(for)g Fj(string)42 b +Fp(in)34 b(the)h(history)f(list,)i(starting)f(at)g Fj(p)s(os)p +Fp(,)g(an)f(absolute)h(index)e(in)m(to)j(the)e(list.)390 +4074 y(If)i Fj(direction)g Fp(is)g(negativ)m(e,)k(the)c(searc)m(h)h +(pro)s(ceeds)f(bac)m(kw)m(ard)g(from)g Fj(p)s(os)p Fp(,)h(otherwise)f +(forw)m(ard.)390 4183 y(Returns)c(the)h(index)g(in)f(the)h(history)g +(list)h(of)f(the)g(history)g(elemen)m(t)i(where)d Fj(string)41 +b Fp(w)m(as)33 b(found,)390 4293 y(or)d(-1)h(otherwise.)150 +4480 y Fi(2.3.6)63 b(Managing)41 b(the)g(History)h(File)150 +4627 y Fp(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 4736 y(the)k(functions)e(for)i +(managing)g(a)g(history)f(\014le.)3350 4902 y([F)-8 b(unction])-3599 +b Fg(int)53 b(read_history)c Ff(\()p Fe(const)34 b(c)m(har)g +(*\014lename)p Ff(\))390 5011 y Fp(Add)g(the)h(con)m(ten)m(ts)h(of)f +Fj(\014lename)k Fp(to)d(the)f(history)f(list,)j(one)e(en)m(try)f(at)i +(a)f(time.)54 b(If)34 b Fj(\014lename)40 b Fp(is)390 +5121 y Fo(NULL)p Fp(,)33 b(this)h(reads)f(from)g Fo(~/.history)p +Fp(,)e(if)j(it)g(exists.)50 b(This)33 b(attempts)h(to)g(determine)g +(whether)390 5230 y(the)23 b(history)h(\014le)f(includes)g(timestamp)h +(information,)h(and)d(assigns)i(timestamps)g(to)g(the)f(history)390 +5340 y(en)m(tries)31 b(it)g(reads)f(if)h(so.)41 b(Returns)29 +b(0)i(if)f(successful,)g(or)h Fo(errno)e Fp(if)h(not.)p eop end %%Page: 8 11 -TeXDict begin 8 10 bop 150 -116 a Fq(Chapter)30 b(2:)41 +TeXDict begin 8 10 bop 150 -116 a Fp(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 +299 y([F)-8 b(unction])-3599 b Fg(int)53 b(read_history_range)e +Ff(\()p Fe(const)34 b(c)m(har)g(*\014lename,)g(in)m(t)f(from,)g(in)m(t) +g(to)p Ff(\))390 408 y Fp(Read)28 b(a)g(range)h(of)f(lines)g(from)f +Fj(\014lename)p Fp(,)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 Fj(from)e +Fp(and)h(end)f(at)i Fj(to)p Fp(.)41 b(If)25 b Fj(from)h +Fp(is)g(zero,)i(start)f(at)g(the)f(b)s(eginning.)39 b(If)26 +b Fj(to)31 b Fp(is)c(less)f(than)g Fj(from)p Fp(,)390 +628 y(this)33 b(reads)h(un)m(til)g(the)f(end)g(of)h(the)g(\014le.)50 +b(This)33 b(attempts)h(to)h(determine)e(whether)g(the)h(history)390 +737 y(\014le)d(includes)f(timestamp)h(information,)h(and)e(assigns)h +(timestamps)g(to)g(the)g(history)g(en)m(tries)g(it)390 +847 y(reads)f(if)h(so.)41 b(If)30 b Fj(\014lename)35 +b Fp(is)c Fo(NULL)p Fp(,)e(this)i(reads)f(from)g Fo(~/.history)p +Fp(,)e(if)i(it)h(exists.)42 b(Returns)29 b(0)i(if)390 +956 y(successful,)f(or)h Fo(errno)e Fp(if)h(not.)3350 +1156 y([F)-8 b(unction])-3599 b Fg(int)53 b(write_history)d +Ff(\()p Fe(const)34 b(c)m(har)g(*\014lename)p Ff(\))390 +1265 y Fp(W)-8 b(rite)34 b(the)f(curren)m(t)g(history)g(to)g +Fj(\014lename)p Fp(,)h(o)m(v)m(erwriting)g Fj(\014lename)k +Fp(if)33 b(necessary)-8 b(.)49 b(This)32 b(writes)390 +1375 y(timestamp)37 b(information)g(if)g(the)g Fo +(history_write_timestamps)30 b Fp(v)-5 b(ariable)38 b(is)e(set)i(to)f +(a)g(non-)390 1484 y(zero)31 b(v)-5 b(alue.)43 b(If)30 +b Fj(\014lename)36 b Fp(is)31 b Fo(NULL)p Fp(,)e(then)i(write)g(the)g +(history)f(list)i(to)f Fo(~/.history)p Fp(.)39 b(Returns)30 +b(0)390 1594 y(on)g(success,)h(or)f Fo(errno)f Fp(on)i(a)f(read)h(or)f +(write)h(error.)3350 1793 y([F)-8 b(unction])-3599 b +Fg(int)53 b(append_history)d Ff(\()p Fe(in)m(t)33 b(nelemen)m(ts,)i +(const)f(c)m(har)f(*\014lename)p Ff(\))390 1903 y Fp(App)s(end)39 +b(the)h(last)i Fj(nelemen)m(ts)j Fp(of)c(the)f(history)h(list)g(to)g +Fj(\014lename)p Fp(.)72 b(This)40 b(writes)g(timestamp)390 +2012 y(information)30 b(if)f(the)h Fo(history_write_timestamps)23 +b Fp(v)-5 b(ariable)30 b(is)f(set)h(to)h(a)e(non-zero)h(v)-5 +b(alue.)41 b(If)390 2122 y Fj(\014lename)d Fp(is)33 b +Fo(NULL)p Fp(,)g(then)g(app)s(end)e(to)i Fo(~/.history)p +Fp(.)46 b(Returns)32 b(0)h(on)g(success,)h(or)f Fo(errno)f +Fp(on)h(a)390 2232 y(read)d(or)h(write)f(error.)3350 +2431 y([F)-8 b(unction])-3599 b Fg(int)53 b(history_truncate_file)f +Ff(\()p Fe(const)34 b(c)m(har)g(*\014lename,)f(in)m(t)h(nlines)p +Ff(\))390 2540 y Fp(T)-8 b(runcate)39 b(the)f(history)h(\014le)f +Fj(\014lename)p Fp(,)j(lea)m(ving)f(only)f(the)g(last)g +Fj(nlines)j Fp(lines.)65 b(If)38 b Fj(\014lename)44 b +Fp(is)390 2650 y Fo(NULL)p Fp(,)29 b(this)i(truncates)f +Fo(~/.history)p Fp(.)38 b(Returns)30 b(0)h(on)f(success,)h(or)f +Fo(errno)f Fp(on)h(failure.)150 2857 y Fi(2.3.7)63 b(History)41 +b(Expansion)150 3004 y Fp(These)30 b(functions)g(implemen)m(t)h +(history)f(expansion.)3350 3203 y([F)-8 b(unction])-3599 +b Fg(int)53 b(history_expand)d Ff(\()p Fe(const)34 b(c)m(har)g +(*string,)e(c)m(har)i(**output)p Ff(\))390 3313 y Fp(Expand)f +Fj(string)p Fp(,)j(placing)f(the)f(result)h(in)m(to)g +Fj(output)p Fp(,)g(a)g(p)s(oin)m(ter)f(to)h(a)g(string)f(\(see)i +(Section)f(1.1)390 3422 y([History)c(In)m(teraction],)i(page)e(1\).)41 +b(Returns:)390 3593 y Fo(0)432 b Fp(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 +(as)f(the)870 3702 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 +390 3869 y Fo(1)432 b Fp(if)30 b(expansions)g(did)g(tak)m(e)i(place;) +390 4036 y Fo(-1)384 b Fp(if)30 b(there)h(w)m(as)g(an)f(error)g(in)g +(expansion;)390 4203 y Fo(2)432 b Fp(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 +f(the)h Fo(:p)870 4313 y Fp(mo)s(di\014er)h(\(see)j(Section)f(1.1.3)h +([Mo)s(di\014ers],)e(page)i(3\).)390 4483 y(If)f(an)g(error)g(o)s +(ccurred)g(during)f(expansion,)i(then)f Fj(output)i Fp(con)m(tains)g(a) +e(descriptiv)m(e)i(error)e(mes-)390 4593 y(sage.)3350 +4792 y([F)-8 b(unction])-3599 b Fg(char)54 b(*)e(get_history_event)f +Ff(\()p Fe(const)34 b(c)m(har)g(*string,)e(in)m(t)h(*cindex,)h(in)m(t) +565 4902 y(qc)m(har)p Ff(\))390 5011 y Fp(Returns)26 +b(the)g(text)i(of)f(the)g(history)f(ev)m(en)m(t)i(b)s(eginning)e(at)h +Fj(string)35 b Fo(+)26 b Fj(*cindex)p Fp(.)40 b(Mo)s(di\014es)26 +b Fj(*cindex)390 5121 y Fp(to)g(p)s(oin)m(t)f(to)h(after)g(the)f(ev)m +(en)m(t)i(sp)s(eci\014er.)39 b(A)m(t)26 b(function)f(en)m(try)-8 +b(,)27 b Fj(cindex)32 b Fp(p)s(oin)m(ts)25 b(to)h(the)f(index)g(in)m +(to)390 5230 y Fj(string)30 b Fp(where)21 b(the)h(history)g(ev)m(en)m +(t)h(sp)s(eci\014cation)f(b)s(egins.)38 b Fj(qc)m(har)28 +b Fp(is)22 b(a)g(c)m(haracter)i(that)e(is)g(allo)m(w)m(ed)390 +5340 y(to)31 b(end)f(the)g(ev)m(en)m(t)i(sp)s(eci\014cation)f(in)g +(addition)f(to)h(the)g(\\normal")g(terminating)g(c)m(haracters.)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) +TeXDict begin 9 11 bop 150 -116 a Fp(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1780 b(9)3350 +299 y([F)-8 b(unction])-3599 b Fg(char)54 b(**)e(history_tokenize)f +Ff(\()p Fe(const)34 b(c)m(har)g(*string)p Ff(\))390 408 +y Fp(Return)c(an)h(arra)m(y)g(of)g(tok)m(ens)h(parsed)e(out)h(of)g +Fj(string)p Fp(,)h(m)m(uc)m(h)e(as)i(the)f(shell)g(migh)m(t.)43 +b(The)30 b(tok)m(ens)390 518 y(are)h(split)g(on)f(the)h(c)m(haracters)h +(in)e(the)h Fj(history)p 2006 518 28 4 v 40 w(w)m(ord)p +2241 518 V 39 w(delimiters)k Fp(v)-5 b(ariable,)32 b(and)e(shell)g +(quoting)390 628 y(con)m(v)m(en)m(tions)i(are)f(ob)s(ey)m(ed)g(as)f +(describ)s(ed)g(b)s(elo)m(w.)3350 815 y([F)-8 b(unction])-3599 +b Fg(char)54 b(*)e(history_arg_extract)f Ff(\()p Fe(in)m(t)34 +b(\014rst,)f(in)m(t)g(last,)g(const)h(c)m(har)f(*string)p +Ff(\))390 924 y Fp(Extract)41 b(a)g(string)f(segmen)m(t)i(consisting)f +(of)f(the)h Fj(\014rst)g Fp(through)f Fj(last)j Fp(argumen)m(ts)e +(presen)m(t)f(in)390 1034 y Fj(string)p Fp(.)h(This)29 +b(splits)i Fj(string)38 b Fp(in)m(to)31 b(argumen)m(ts)g(using)f +Fo(history_tokenize)p Fp(.)150 1277 y Fn(2.4)68 b(History)46 +b(V)-11 b(ariables)150 1436 y Fp(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 Fk(gnu)g Fp(History)g(Library)-8 b(.)3371 1624 +y([V)g(ariable])-3598 b Fg(int)53 b(history_base)390 +1733 y Fp(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 1921 y([V)-8 b(ariable])-3598 +b Fg(int)53 b(history_length)390 2030 y Fp(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 2217 y([V)-8 b(ariable])-3598 b Fg(int)53 b(history_max_entries) +390 2327 y Fp(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 +Fo(stifle_)390 2437 y(history\(\))p Fp(.)3371 2624 y([V)-8 +b(ariable])-3598 b Fg(int)53 b(history_write_timesta)q(mps)390 +2733 y Fp(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 +2843 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 +m(ed.)390 2979 y(The)41 b(curren)m(t)g(timestamp)h(format)g(uses)f(the) +h(v)-5 b(alue)42 b(of)f Fj(history)p 2697 2979 V 41 w(commen)m(t)p +3098 2979 V 41 w(c)m(har)48 b Fp(to)42 b(delimit)390 +3089 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 3198 y(default\),)31 b(the)g(history)f +(library)g(will)h(not)f(write)h(timestamps.)3371 3385 +y([V)-8 b(ariable])-3598 b Fg(char)54 b(history_expansion_char)390 +3495 y Fp(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 +Fo(!)p Fp('.)56 b(Setting)35 b(this)h(to)g(0)390 3605 +y(inhibits)30 b(history)g(expansion.)3371 3792 y([V)-8 +b(ariable])-3598 b Fg(char)54 b(history_subst_char)390 +3901 y Fp(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 +b(The)390 4011 y(default)31 b(is)f(`)p Fo(^)p Fp('.)3371 +4198 y([V)-8 b(ariable])-3598 b Fg(char)54 b(history_comment_char)390 +4308 y Fp(During)34 b(tok)m(enization,)39 b(if)c(this)g(c)m(haracter)h +(app)s(ears)e(as)h(the)g(\014rst)f(c)m(haracter)i(of)f(a)g(w)m(ord,)h +(then)390 4418 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 +4527 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 4714 +y([V)-8 b(ariable])-3598 b Fg(char)54 b(*)e(history_word_delimiter)q(s) +390 4824 y Fp(The)27 b(c)m(haracters)i(that)f(separate)h(tok)m(ens)f +(for)f Fo(history_tokenize\(\))p Fp(.)35 b(The)27 b(default)h(v)-5 +b(alue)28 b(is)f Fo(")390 4934 y(\\t\\n\(\)<>;&|")p Fp(.)3371 +5121 y([V)-8 b(ariable])-3598 b Fg(char)54 b(*)e +(history_search_delimit)q(er_)q(cha)q(rs)390 5230 y Fp(The)26 +b(list)g(of)g(additional)h(c)m(haracters)h(whic)m(h)e(can)g(delimit)h +(a)f(history)g(searc)m(h)h(string,)g(in)f(addition)390 +5340 y(to)31 b(space,)g(T)-8 b(AB,)32 b(`)p Fo(:)p Fp(')e(and)g(`)p +Fo(?)p Fp(')g(in)g(the)h(case)g(of)g(a)g(substring)e(searc)m(h.)41 +b(The)30 b(default)h(is)f(empt)m(y)-8 b(.)p eop end %%Page: 10 13 -TeXDict begin 10 12 bop 150 -116 a Fq(Chapter)30 b(2:)41 +TeXDict begin 10 12 bop 150 -116 a Fp(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 +299 y([V)-8 b(ariable])-3598 b Fg(char)54 b(*)e(history_no_expand_char) +q(s)390 408 y Fp(The)29 b(list)i(of)f(c)m(haracters)h(whic)m(h)e +(inhibit)h(history)g(expansion)f(if)h(found)e(immediately)j(follo)m +(wing)390 518 y Fj(history)p 672 518 28 4 v 40 w(expansion)p +1104 518 V 40 w(c)m(har)p Fp(.)41 b(The)30 b(default)g(is)h(space,)g +(tab,)g(newline,)f(carriage)i(return,)e(and)g(`)p Fo(=)p +Fp('.)3371 696 y([V)-8 b(ariable])-3598 b Fg(int)53 b +(history_quotes_inhibi)q(t_ex)q(pan)q(sio)q(n)390 806 +y Fp(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 +916 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 +1025 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 +1135 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.)3371 +1313 y([V)-8 b(ariable])-3598 b Fg(int)53 b(history_quoting_state)390 +1423 y Fp(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 +(eing)g(expanded)390 1532 y(is)h(sub)5 b(ject)28 b(to)i(existing)f +(quoting.)41 b(If)28 b(set)h(to)h(`)p Fo(')p Fp(',)f(history)g +(expansion)f(assumes)h(that)g(the)g(line)g(is)390 1642 +y(single-quoted)36 b(and)e(inhibit)g(expansion)g(un)m(til)h(it)g(reads) +g(an)f(unquoted)g(closing)i(single)f(quote;)390 1751 +y(if)k(set)h(to)h(`)p Fo(")p Fp(',)h(history)d(expansion)g(assumes)h +(the)f(line)h(is)f(double)h(quoted)f(un)m(til)h(it)g(reads)f(an)390 +1861 y(unquoted)d(closing)j(double)e(quote.)62 b(If)37 +b(set)h(to)g(0,)i(the)d(default,)j(history)d(expansion)g(assumes)390 +1971 y(the)29 b(line)h(is)f(not)g(quoted)h(and)e(treats)i(quote)g(c)m +(haracters)h(within)d(the)i(line)f(as)g(describ)s(ed)f(ab)s(o)m(v)m(e.) +390 2080 y(This)33 b(is)h(only)f(e\013ectiv)m(e)k(if)c +Fj(history)p 1621 2080 V 40 w(quotes)p 1916 2080 V 41 +w(inhibit)p 2220 2080 V 40 w(expansion)g Fp(is)h(set.)51 +b(This)33 b(is)h(in)m(tended)f(for)390 2190 y(use)d(b)m(y)g +(applications)i(lik)m(e)g(Bash)e(whic)m(h)g(allo)m(w)i(quoted)f +(strings)f(to)h(span)e(m)m(ultiple)j(lines.)3371 2368 +y([V)-8 b(ariable])-3598 b Fg(rl_linebuf_func_t)57 b(*)c +(history_inhibit_expans)q(ion)q(_fu)q(ncti)q(on)390 2478 +y Fp(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 Fo(char)29 b(*)390 2587 y Fp(\()p Fj(string)8 +b Fp(\))27 b(and)f(an)g Fo(int)g Fp(index)g(in)m(to)i(that)f(string)f +(\()p Fj(i)5 b Fp(\).)40 b(It)27 b(should)f(return)f(a)i(non-zero)g(v) +-5 b(alue)27 b(if)g(the)390 2697 y(history)i(expansion)g(starting)h(at) +g Fj(string[i])j Fp(should)28 b(not)i(b)s(e)e(p)s(erformed;)h(zero)h +(if)f(the)g(expansion)390 2806 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 +(e)h(Bash)e(that)g(use)g(the)g(history)390 2916 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 +Fo(NULL)p Fp(.)150 3153 y Fn(2.5)68 b(History)46 b(Programming)g +(Example)150 3312 y Fp(The)30 b(follo)m(wing)i(program)e(demonstrates)h +(simple)f(use)g(of)h(the)f Fk(gnu)g Fp(History)h(Library)-8 +b(.)390 3422 y Fd(#include)41 b()390 3509 y(#include)g +()390 3684 y(int)390 3771 y(main)f(\(int)g(argc,)h +(char)f(**argv\))390 3858 y({)468 3945 y(char)h(line[1024],)g(*t;)468 +4032 y(int)f(len,)g(done)h(=)e(0;)468 4207 y(line[0])i(=)f(0;)468 +4381 y(using_history)j(\(\);)468 4468 y(while)e(\(!done\))547 +4555 y({)625 4643 y(printf)g(\("history$)g("\);)625 4730 +y(fflush)g(\(stdout\);)625 4817 y(t)f(=)f(fgets)i(\(line,)f(sizeof)h +(\(line\))f(-)g(1,)g(stdin\);)625 4904 y(if)g(\(t)g(&&)f(*t\))704 +4991 y({)782 5078 y(len)h(=)g(strlen)g(\(t\);)782 5166 +y(if)g(\(t[len)h(-)e(1])h(==)f('\\n'\))861 5253 y(t[len)h(-)g(1])f(=)h +('\\0';)704 5340 y(})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 +TeXDict begin 11 13 bop 150 -116 a Fp(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1734 b(11)625 +386 y Fd(if)40 b(\(!t\))704 473 y(strcpy)g(\(line,)h("quit"\);)625 +648 y(if)f(\(line[0]\))704 735 y({)782 822 y(char)g(*expansion;)782 +909 y(int)g(result;)782 1083 y(result)h(=)e(history_expand)k(\(line,)d +(&expansion\);)782 1171 y(if)g(\(result\))861 1258 y(fprintf)h +(\(stderr,)g("\045s\\n",)f(expansion\);)782 1432 y(if)g(\(result)h(<)e +(0)h(||)f(result)i(==)f(2\))861 1519 y({)939 1606 y(free)g +(\(expansion\);)939 1694 y(continue;)861 1781 y(})782 +1955 y(add_history)i(\(expansion\);)782 2042 y(strncpy)f(\(line,)g +(expansion,)g(sizeof)g(\(line\))f(-)g(1\);)782 2130 y(free)g +(\(expansion\);)704 2217 y(})625 2391 y(if)g(\(strcmp)h(\(line,)f +("quit"\))h(==)f(0\))704 2478 y(done)g(=)f(1;)625 2565 +y(else)h(if)g(\(strcmp)h(\(line,)g("save"\))f(==)g(0\))704 +2653 y(write_history)i(\("history_file"\);)625 2740 y(else)e(if)g +(\(strcmp)h(\(line,)g("read"\))f(==)g(0\))704 2827 y(read_history)i +(\("history_file"\);)625 2914 y(else)e(if)g(\(strcmp)h(\(line,)g +("list"\))f(==)g(0\))704 3001 y({)782 3088 y(register)h(HIST_ENTRY)h +(**the_list;)782 3176 y(register)f(int)f(i;)782 3350 +y(the_list)h(=)f(history_list)i(\(\);)782 3437 y(if)e(\(the_list\))861 +3524 y(for)g(\(i)f(=)h(0;)f(the_list[i];)j(i++\))939 +3611 y(printf)f(\("\045d:)f(\045s\\n",)h(i)e(+)h(history_base,)i +(the_list[i]->line\);)704 3699 y(})625 3786 y(else)e(if)g(\(strncmp)h +(\(line,)g("delete",)g(6\))f(==)f(0\))704 3873 y({)782 +3960 y(int)h(which;)782 4047 y(if)g(\(\(sscanf)h(\(line)f(+)g(6,)g +("\045d",)g(&which\)\))h(==)f(1\))861 4134 y({)939 4222 +y(HIST_ENTRY)i(*entry)e(=)g(remove_history)i(\(which\);)939 +4309 y(if)e(\(!entry\))1018 4396 y(fprintf)g(\(stderr,)i("No)d(such)i +(entry)f(\045d\\n",)h(which\);)939 4483 y(else)1018 4570 +y({)1096 4658 y(free)f(\(entry->line\);)1096 4745 y(free)g(\(entry\);) +1018 4832 y(})861 4919 y(})782 5006 y(else)861 5093 y({)939 +5181 y(fprintf)h(\(stderr,)g("non-numeric)h(arg)e(given)g(to)g +(`delete'\\n"\);)861 5268 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 +TeXDict begin 12 14 bop 150 -116 a Fp(Chapter)30 b(2:)41 +b(Programming)30 b(with)g(GNU)h(History)1734 b(12)704 +299 y Fd(})547 386 y(})390 473 y(})p eop end +%%Page: 13 16 +TeXDict begin 13 15 bop 3659 -116 a Fp(13)150 299 y Fl(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 +502 y Fp(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 Fm(\015)e +Fp(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 +y Fo(http://fsf.org/)390 964 y Fp(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 +1450 y(useful)29 b(do)s(cumen)m(t)h Fj(free)36 b Fp(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 @@ -6056,10 +6121,10 @@ b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g 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 +%%Page: 14 17 +TeXDict begin 14 16 bop 150 -116 a Fp(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(14)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 @@ -6097,23 +6162,23 @@ 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 +-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fk(asci)r(i)g +Fp(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 +Fr(SGML)f Fp(or)f Fr(XML)g Fp(using)g(a)g(publicly)330 +2504 y(a)m(v)-5 b(ailable)42 b Fr(DTD)p Fp(,)h(and)c +(standard-conforming)g(simple)h Fr(HTML)p Fp(,)i(P)m(ostScript)e(or)f +Fr(PDF)h Fp(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) +Fr(PNG)p Fp(,)i Fr(X)n(CF)330 2724 y Fp(and)e Fr(JPG)p +Fp(.)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 +Fr(SGML)54 b Fp(or)f Fr(XML)h Fp(for)g(whic)m(h)f(the)h +Fr(DTD)g Fp(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 +(hine-generated)j Fr(HTML)p Fp(,)330 3052 y(P)m(ostScript)31 +b(or)f Fr(PDF)h Fp(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 @@ -6150,10 +6215,10 @@ b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m 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 +%%Page: 15 18 +TeXDict begin 15 17 bop 150 -116 a Fp(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 +b(15)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 @@ -6243,10 +6308,10 @@ 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 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 +%%Page: 16 19 +TeXDict begin 16 18 bop 150 -116 a Fp(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 +b(16)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 @@ -6325,10 +6390,10 @@ b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g (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 +%%Page: 17 20 +TeXDict begin 17 19 bop 150 -116 a Fp(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(17)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 @@ -6413,10 +6478,10 @@ 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 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 +%%Page: 18 21 +TeXDict begin 18 20 bop 150 -116 a Fp(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 +b(18)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 @@ -6501,10 +6566,10 @@ 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 (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 +%%Page: 19 22 +TeXDict begin 19 21 bop 150 -116 a Fp(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 +b(19)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 @@ -6512,7 +6577,7 @@ 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 +762 y(See)c Fo(http://www.gnu.org/copy)o(left)o(/)p Fp(.)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 @@ -6568,17 +6633,17 @@ f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g 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 +%%Page: 20 23 +TeXDict begin 20 22 bop 150 -116 a Fp(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(20)150 299 y Fn(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 Fp(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 +680 y Fd(Copyright)42 b(\(C\))79 b Fc(year)g(your)40 +b(name)p Fd(.)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 @@ -6586,15 +6651,15 @@ y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i 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 +1203 y(Free)g(Documentation)h(License''.)275 1337 y Fp(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 +1559 y Fd(with)40 b(the)g(Invariant)h(Sections)g(being)g +Fc(list)f(their)g(titles)p Fd(,)h(with)547 1646 y(the)f(Front-Cover)i +(Texts)e(being)g Fc(list)p Fd(,)h(and)f(with)g(the)g(Back-Cover)h +(Texts)547 1733 y(being)f Fc(list)p Fd(.)275 1868 y Fp(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 @@ -6606,16 +6671,16 @@ y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g 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 +%%Page: 21 24 +TeXDict begin 21 23 bop 150 -116 a Fp(App)s(endix)29 +b(B:)i(Concept)f(Index)2391 b(21)150 100 y Fl(App)t(endix)52 +b(B)81 b(Concept)51 b(Index)146 434 y Fn(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 +g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fb(7)146 782 y Fn(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 +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fb(1)146 1140 y Fn(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 @@ -6625,39 +6690,39 @@ 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 +%%Page: 22 25 +TeXDict begin 22 24 bop 150 -116 a Fp(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(22)150 100 y Fl(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 Fd(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 +g(:)25 b Fb(9)150 487 y Fd(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 +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fb(9)150 574 y Fd (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 Fb(9)150 661 y Fd(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 +749 y Fd(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 +f(:)g(:)g(:)g(:)g(:)37 b Fb(9)150 836 y Fd(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 +923 y Fd(history_no_expand_chars)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(10)150 1010 y Fd(history_quotes_inhibit_expans)q(ion)9 +b Fa(:)18 b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)22 +b Fb(10)150 1097 y Fd(history_quoting_state)i 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 +(:)g(:)g(:)h(:)f(:)33 b Fb(10)150 1184 y Fd (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 +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fb(9)150 1272 y Fd (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 +27 b Fb(9)150 1359 y Fd(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 +(:)f(:)g(:)g(:)g(:)31 b Fb(9)150 1446 y Fd(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 diff --git a/doc/history.texi b/doc/history.texi index 721118b..e78773e 100644 --- a/doc/history.texi +++ b/doc/history.texi @@ -1,4 +1,4 @@ -\input texinfo @c -*-texinfo-*- +c\input texinfo @c -*-texinfo-*- @c %**start of header (This is for running Texinfo on a region.) @setfilename history.info @settitle GNU History Library @@ -12,7 +12,7 @@ This document describes the GNU History library a programming tool that provides a consistent user interface for recalling lines of previously typed input. -Copyright @copyright{} 1988--2022 Free Software Foundation, Inc. +Copyright @copyright{} 1988--2025 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document diff --git a/doc/history_3.pdf b/doc/history_3.pdf new file mode 100644 index 0000000..a900908 Binary files /dev/null and b/doc/history_3.pdf differ diff --git a/doc/history_3.ps b/doc/history_3.ps index 4440b3f..f74c4bc 100644 --- a/doc/history_3.ps +++ b/doc/history_3.ps @@ -1,10 +1,11 @@ %!PS-Adobe-3.0 -%%Creator: groff version 1.22.4 -%%CreationDate: Fri Sep 23 09:52:37 2022 -%%DocumentNeededResources: font Times-Roman +%%Creator: groff version 1.23.0 +%%CreationDate: Wed Jun 25 16:09:16 2025 +%%DocumentNeededResources: font Times-Italic +%%+ font Times-Roman %%+ font Times-Bold -%%+ font Times-Italic -%%DocumentSuppliedResources: procset grops 1.22 4 +%%+ font Courier +%%DocumentSuppliedResources: procset grops 1.23 0 %%Pages: 7 %%PageOrder: Ascend %%DocumentMedia: Default 612 792 0 () () @@ -14,7 +15,7 @@ %%PageMedia: Default %%EndDefaults %%BeginProlog -%%BeginResource: procset grops 1.22 4 +%%BeginResource: procset grops 1.23 0 %!PS-Adobe-3.0 Resource-ProcSet /setpacking where{ pop @@ -22,6 +23,7 @@ currentpacking true setpacking }if /grops 120 dict dup begin +% The ASCII code of the space character. /SC 32 def /A/show load def /B{0 SC 3 -1 roll widthshow}bind def @@ -43,16 +45,18 @@ true setpacking /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 +% name size font SF - /SF{ findfont exch [exch dup 0 exch 0 exch neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def }bind def +% name a c d font MF - /MF{ findfont [5 2 roll -0 3 1 roll +0 3 1 roll % b neg 0 0]makefont dup setfont [exch/setfont cvx]cvx bind def @@ -61,13 +65,19 @@ dup setfont /RES 0 def /PL 0 def /LS 0 def +% Enable manual feed. +% MANUAL - /MANUAL{ statusdict begin/manualfeed true store end }bind def +% Guess the page length. +% This assumes that the imageable area is vertically centered on the page. +% PLG - length /PLG{ gsave newpath clippath pathbbox grestore exch pop add exch pop }bind def +% BP - /BP{ /level0 save def 1 setlinecap @@ -85,47 +95,61 @@ LS{ level0 restore showpage }def +% centerx centery radius startangle endangle DA - /DA{ newpath arcn stroke }bind def +% x y SN - x' y' +% round a position to nearest (pixel + (.25,.25)) /SN{ transform .25 sub exch .25 sub exch round .25 add exch round .25 add exch itransform }bind def +% endx endy startx starty DL - +% we round the endpoints of the line, so that parallel horizontal +% and vertical lines will appear even /DL{ SN moveto SN lineto stroke }bind def +% centerx centery radius DC - /DC{ newpath 0 360 arc closepath }bind def /TM matrix def +% width height centerx centery DE - /DE{ TM currentmatrix pop translate scale newpath 0 0 .5 0 360 arc closepath TM setmatrix }bind def +% these are for splines /RC/rcurveto load def /RL/rlineto load def /ST/stroke load def /MT/moveto load def /CL/closepath load def +% fill the last path +% r g b Fr - /Fr{ setrgbcolor fill }bind def +% c m y k Fk - /setcmykcolor where{ pop /Fk{ setcmykcolor fill }bind def }if +% g Fg - /Fg{ setgray fill }bind def +% fill with the "current color" /FL/fill load def /LW/setlinewidth load def /Cr/setrgbcolor load def @@ -134,6 +158,7 @@ pop /Ck/setcmykcolor load def }if /Cg/setgray load def +% new_font_name encoding_vector old_font_name RE - /RE{ findfont dup maxlength 1 index/FontName known not{1 add}if dict begin @@ -148,6 +173,7 @@ dup/FontName exch def currentdict end definefont pop }bind def /DEFS 0 def +% hpos vpos EBEGIN - /EBEGIN{ moveto DEFS begin @@ -155,11 +181,13 @@ DEFS begin /EEND/end load def /CNT 0 def /level1 0 def +% llx lly newwid wid newht ht newllx newlly PBEGIN - /PBEGIN{ /level1 save def translate div 3 1 roll div exch scale neg exch neg exch translate +% set the graphics state to default values 0 setgray 0 setlinecap 1 setlinewidth @@ -178,6 +206,10 @@ newpath /CNT countdictstack def userdict begin /showpage{}def +% +% Any included setpagedevice should be ignored. +% See: http://www.w-beer.de/doc/ps/. +% /setpagedevice{}def mark }bind def @@ -197,9 +229,10 @@ setpacking %%BeginFeature: *PageSize Default << /PageSize [ 612 792 ] /ImagingBBox null >> setpagedevice %%EndFeature +%%IncludeResource: font Times-Italic %%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 @@ -228,669 +261,738 @@ def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron /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 +/Courier@0 ENC0/Courier RE/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 +ENC0/Times-Roman RE/Times-Italic@0 ENC0/Times-Italic 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 +/F0 10/Times-Italic@0 SF(HIST)72.58 48 Q(OR)-.18 E(Y)-.18 E/F1 10 +/Times-Roman@0 SF 125.855(\(3\) Library)1.27 F(Functions Manual)2.5 E F0 +(HIST)128.935 E(OR)-.18 E(Y)-.18 E F1(\(3\))1.27 E/F2 10.95/Times-Bold@0 +SF -.219(NA)72 84 S(ME).219 E F1(history \255 GNU History Library)108 96 +Q F2(COPYRIGHT)72 112.8 Q F1(The GNU History Library is Cop)108 124.8 Q +(yright \251 1989-2025 by the Free Softw)-.1 E(are F)-.1 E +(oundation, Inc.)-.15 E F2(DESCRIPTION)72 141.6 Q F1(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 +(eep track of)-.1 F .655(those lines, associate arbitrary data with eac\ +h line, and utilize information from pre)108 165.6 R .655 +(vious lines when com-)-.25 F(posing ne)108 177.6 Q 2.5(wo)-.25 G(nes.) +-2.5 E .887(The History library pro)108 194.4 R .887 +(vides functions that allo)-.15 F 3.386(wa)-.25 G .886 +(pplications to their)-3.386 F F0(history)3.386 E F1 3.386(,t)C .886 +(he set of pre)-3.386 F(viously-typed)-.25 E .955(lines, which it k)108 +206.4 R .955(eeps in a list.)-.1 F .955 +(Applications can choose which lines to sa)5.955 F 1.255 -.15(ve i)-.2 H +.956(nto a history list, ho).15 F 3.456(wm)-.25 G(an)-3.456 E(y)-.15 E +.314(commands to sa)108 218.4 R -.15(ve)-.2 G 2.814(,s).15 G -2.25 -.2 +(av e)-2.814 H 2.814(ah)3.014 G .314(istory list to a \214le, read a hi\ +story list from a \214le, and display lines from the his-)-2.814 F +(tory in v)108 230.4 Q(arious formats.)-.25 E F2(HIST)72 247.2 Q(OR) +-.197 E 2.738(YE)-.383 G(XP)-2.738 E(ANSION)-.81 E F1 .822 +(The history library supports a history e)108 259.2 R .823 +(xpansion feature that is identical to the history e)-.15 F .823 +(xpansion in)-.15 F/F3 10/Times-Bold@0 SF(bash)3.323 E F1(.)A +(This section describes what syntax features are a)108 271.2 Q -.25(va) +-.2 G(ilable.).25 E 1.306(History e)108 288 R 1.306 (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 + input stream, making it easy to repeat)-.1 F .209 +(commands, insert the ar)108 300 R .209(guments to a pre)-.18 F .21 (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 +F(vious)-.25 E(commands quickly)108 312 Q(.)-.65 E 1.297(History e)108 +328.8 R 1.297(xpansion is usually performed immediately after a complet\ +e line is read.)-.15 F 1.297(It tak)6.297 F 1.296(es place in tw)-.1 F +(o)-.1 E 3.198(parts. The)108 340.8 R .698(\214rst is to determine whic\ +h history list entry to use during substitution.)3.198 F .699 +(The second is to select)5.699 F +(portions of that entry to include into the current one.)108 352.8 Q +.075(The entry selected from the history is the)108 369.6 R F0 -.15(ev) +2.575 G(ent).15 E F1 2.575(,a)C .074 +(nd the portions of that entry that are acted upon are)-2.575 F F0(wor) +2.574 E(ds)-.37 E F1(.)A -1.11(Va)108 381.6 S(rious)1.11 E F0 +(modi\214er)2.942 E(s)-.1 E F1 .443(are a)2.943 F -.25(va)-.2 G .443 +(ilable to manipulate the selected w).25 F 2.943(ords. The)-.1 F .443 +(entry is split into w)2.943 F .443(ords in the same)-.1 F -.1(fa)108 +393.6 S .393(shion as).1 F F3(bash)2.893 E F1 .393 +(does when reading input, so that se)2.893 F -.15(ve)-.25 G .392(ral w) +.15 F .392(ords that w)-.1 F .392(ould otherwise be separated are con-) +-.1 F .232(sidered one w)108 405.6 R .232 +(ord when surrounded by quotes \(see the description of)-.1 F F3 +(history_tok)2.732 E(enize\(\))-.1 E F1(belo)2.732 E 2.733(w\). The)-.25 +F F0 -.15(ev)2.733 G(ent).15 E(designator)108 417.6 Q F1 1.182 +(selects the e)3.682 F -.15(ve)-.25 G 1.182(nt, the optional).15 F F0 +(wor)3.682 E 3.682(dd)-.37 G(esignator)-3.682 E F1 1.182(selects w)3.682 +F 1.182(ords from the e)-.1 F -.15(ve)-.25 G 1.182(nt, and v).15 F 1.182 +(arious op-)-.25 F(tional)108 429.6 Q F0(modi\214er)2.5 E(s)-.1 E F1 +(are a)2.5 E -.25(va)-.2 G(ilable to manipulate the selected w).25 E +(ords.)-.1 E .574(History e)108 446.4 R .574 +(xpansions are introduced by the appearance of the history e)-.15 F .575 +(xpansion character)-.15 F 3.075(,w)-.4 G .575(hich is)-3.075 F F3(!) +3.908 E F1 .575(by de-)3.908 F -.1(fa)108 458.4 S 2.5(ult. History).1 F +-.15(ex)2.5 G(pansions may appear an).15 E(ywhere in the input, b)-.15 E +(ut do not nest.)-.2 E(Only backslash \()108 475.2 Q F3(\\).833 E F1 2.5 +(\)a).833 G(nd single quotes can quote the history e)-2.5 E +(xpansion character)-.15 E(.)-.55 E .852(There is a special abbre)108 +492 R .851(viation for substitution, acti)-.25 F 1.151 -.15(ve w)-.25 H +.851(hen the).15 F F0(quic)3.351 E 3.351(ks)-.2 G(ubstitution)-3.351 E +F1 .851(character \(def)3.351 F(ault)-.1 E F3<00>3.351 E F1 3.351(\)i)C +(s)-3.351 E .357(the \214rst character on the line.)108 504 R .358 +(It selects the pre)5.357 F .358(vious history list entry)-.25 F 2.858 +(,u)-.65 G .358(sing an e)-2.858 F -.15(ve)-.25 G .358 +(nt designator equi).15 F -.25(va)-.25 G(lent).25 E(to)108 516 Q F3(!!) +3.285 E F1 3.285(,a)C .784 +(nd substitutes one string for another in that entry)-3.285 F 5.784(.I) +-.65 G 3.284(ti)-5.784 G 3.284(sd)-3.284 G .784(escribed belo)-3.284 F +3.284(wu)-.25 G(nder)-3.284 E F3(Ev)3.284 E .784(ent Designators)-.1 F +F1(.)A(This is the only history e)108 528 Q(xpansion that does not be) +-.15 E(gin with the history e)-.15 E(xpansion character)-.15 E(.)-.55 E +F3(Ev)87 544.8 Q(ent Designators)-.1 E F1 .585(An e)108 556.8 R -.15(ve) +-.25 G .586 +(nt designator is a reference to an entry in the history list.).15 F +.586(The e)5.586 F -.15(ve)-.25 G .586 +(nt designator consists of the por).15 F(-)-.2 E 1.306(tion of the w)108 +568.8 R 1.306(ord be)-.1 F 1.306(ginning with the history e)-.15 F 1.305 +(xpansion character and ending with the w)-.15 F 1.305 +(ord designator if)-.1 F .444(present, or the end of the w)108 580.8 R +2.944(ord. Unless)-.1 F .444(the reference is absolute, e)2.944 F -.15 +(ve)-.25 G .445(nts are relati).15 F .745 -.15(ve t)-.25 H 2.945(ot).15 +G .445(he current position)-2.945 F(in the history list.)108 592.8 Q F3 +(!)108 609.6 Q F1(Start a history substitution, e)144 609.6 Q +(xcept when follo)-.15 E(wed by a)-.25 E F3(blank)2.5 E F1 2.5(,n)C -.25 +(ew)-2.5 G(line, carriage return, =, or \(.).25 E F3(!)108 621.6 Q F0(n) +A F1(Refer to history list entry)144 621.6 Q F0(n)2.86 E F1(.).24 E F3 +<21ad>108 633.6 Q F0(n)A F1(Refer to the current entry minus)144 633.6 Q +F0(n)2.86 E F1(.).24 E F3(!!)108 645.6 Q F1(Refer to the pre)144 645.6 Q +(vious entry)-.25 E 5(.T)-.65 G(his is a synon)-5 E +(ym for \231!\2551\232.)-.15 E F3(!)108 657.6 Q F0(string)A F1 .865(Ref\ +er to the most recent command preceding the current position in the his\ +tory list starting with)144 657.6 R F0(string)144.34 669.6 Q F1(.).22 E +F3(!?)108 681.6 Q F0(string)A F3([?])A F1 1.503(Refer to the most recen\ +t command preceding the current position in the history list containing) +144 693.6 R F0(string)144.34 705.6 Q F1 5.497(.T).22 G .497(he trailing) +-5.497 F F3(?)2.997 E F1 .497(may be omitted if)2.997 F F0(string)3.337 +E F1 .496(is follo)3.216 F .496(wed immediately by a ne)-.25 F 2.996 +(wline. If)-.25 F F0(string)2.996 E F1(is)2.996 E .039(missing, this us\ +es the string from the most recent search; it is an error if there is n\ +o pre)144 717.6 R .04(vious search)-.25 F(string.)144 729.6 Q +(GNU History 8.3)72 768 Q(2024 December 31)126.795 E(1)190.955 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 +/F0 10/Times-Italic@0 SF(HIST)72.58 48 Q(OR)-.18 E(Y)-.18 E/F1 10 +/Times-Roman@0 SF 125.855(\(3\) Library)1.27 F(Functions Manual)2.5 E F0 +(HIST)128.935 E(OR)-.18 E(Y)-.18 E F1(\(3\))1.27 E/F2 12/Times-Bold@0 SF +<00>108 89 Q F0(string1)-5 I F2<00>5 I F0(string2)-5 I F2<00>5 I F1 .753 +(Quick substitution.)144 96 R .753(Repeat the pre)5.753 F .753 +(vious command, replacing)-.25 F F0(string1)3.593 E F1(with)3.253 E F0 +(string2)3.592 E F1 5.752(.E).02 G(qui)-5.752 E -.25(va)-.25 G .752 +(lent to).25 F(\231!!:s)144 108 Q/F3 12/Times-Roman@0 SF<00>5 I F0 +(string1)-5 I F3<00>5 I F0(string2)-5 I F3<00>5 I F1 2.5<9a28>-5 K(see) +-2.5 E/F4 10/Times-Bold@0 SF(Modi\214ers)2.5 E F1(belo)2.5 E(w\).)-.25 E +F4(!#)108 120 Q F1(The entire command line typed so f)144 120 Q(ar)-.1 E +(.)-.55 E F4 -.75(Wo)87 136.8 S(rd Designators).75 E F1 -.8(Wo)108 148.8 +S .067(rd designators are used to select desired w).8 F .067 +(ords from the e)-.1 F -.15(ve)-.25 G 2.567(nt. The).15 F 2.567(ya)-.15 +G .067(re optional; if the w)-2.567 F .068(ord designator)-.1 F(isn')108 +160.8 Q 3.516(ts)-.18 G 1.016(upplied, the history e)-3.516 F 1.016 +(xpansion uses the entire e)-.15 F -.15(ve)-.25 G 3.516(nt. A).15 F F4 +(:)3.516 E F1 1.015(separates the e)3.515 F -.15(ve)-.25 G 1.015 +(nt speci\214cation from the).15 F -.1(wo)108 172.8 S .331 +(rd designator).1 F 5.331(.I)-.55 G 2.832(tm)-5.331 G .332 +(ay be omitted if the w)-2.832 F .332(ord designator be)-.1 F .332 +(gins with a)-.15 F F4<00>2.832 E F1(,)A F4($)2.832 E F1(,)A F4(*)2.832 +E F1(,)A F42.832 E F1 2.832(,o)C(r)-2.832 E F4(%)2.832 E F1 5.332 +(.W)C .332(ords are num-)-6.132 F .194(bered from the be)108 184.8 R +.194(ginning of the line, with the \214rst w)-.15 F .194 +(ord being denoted by 0 \(zero\).)-.1 F -.8(Wo)5.193 G .193 +(rds are inserted into).8 F +(the current line separated by single spaces.)108 196.8 Q F4 2.5(0\()108 +213.6 S(zer)-2.5 E(o\))-.18 E F1(The zeroth w)144 225.6 Q 2.5(ord. F)-.1 +F(or the shell, and man)-.15 E 2.5(yo)-.15 G +(ther applications, this is the command w)-2.5 E(ord.)-.1 E F0(n)108.36 +237.6 Q F1(The)144 237.6 Q F0(n)2.5 E F1(th w)A(ord.)-.1 E F4<00>108 +249.6 Q F1(The \214rst ar)144 249.6 Q(gument: w)-.18 E(ord 1.)-.1 E F4 +($)108 261.6 Q F1 .854(The last w)144 261.6 R 3.354(ord. This)-.1 F .854 +(is usually the last ar)3.354 F .854(gument, b)-.18 F .854(ut e)-.2 F +.855(xpands to the zeroth w)-.15 F .855(ord if there is only)-.1 F +(one w)144 273.6 Q(ord in the line.)-.1 E F4(%)108 285.6 Q F1 1.125 +(The \214rst w)144 285.6 R 1.125(ord matched by the most recent \231?) +-.1 F F0(string)A F1 3.624(?\232 search,)B 1.124 +(if the search string be)3.624 F 1.124(gins with a)-.15 F .486 +(character that is part of a w)144 297.6 R 2.986(ord. By)-.1 F(def)2.986 +E .486(ault, searches be)-.1 F .487 +(gin at the end of each line and proceed to)-.15 F(the be)144 309.6 Q +(ginning, so the \214rst w)-.15 E +(ord matched is the one closest to the end of the line.)-.1 E F0(x) +108.77 321.6 Q F4A F0(y)A F1 2.5(Ar)144 321.6 S(ange of w)-2.5 E +(ords; \231\255)-.1 E F0(y)A F1 2.5<9a61>C(bbre)-2.5 E(viates \2310\255) +-.25 E F0(y)A F1<9a2e>A F4(*)108 333.6 Q F1 .219(All of the w)144 333.6 +R .219(ords b)-.1 F .219(ut the zeroth.)-.2 F .219(This is a synon)5.219 +F .219(ym for \231)-.15 F F0(1\255$)A F1 2.719(\232. It)B .218 +(is not an error to use)2.719 F F4(*)2.718 E F1 .218(if there is)2.718 F +(just one w)144 345.6 Q(ord in the e)-.1 E -.15(ve)-.25 G(nt; it e).15 E +(xpands to the empty string in that case.)-.15 E F4(x*)108 357.6 Q F1 +(Abbre)144 357.6 Q(viates)-.25 E F0(x\255$)2.5 E F1(.)A F4<78ad>108 +369.6 Q F1(Abbre)144 369.6 Q(viates)-.25 E F0(x\255$)2.5 E F1(lik)2.5 E +(e)-.1 E F4(x*)2.5 E F1 2.5(,b)C(ut omits the last w)-2.7 E 2.5(ord. If) +-.1 F F4(x)2.5 E F1(is missing, it def)2.5 E(aults to 0.)-.1 E .368 +(If a w)108 386.4 R .368(ord designator is supplied without an e)-.1 F +-.15(ve)-.25 G .368(nt speci\214cation, the pre).15 F .369 +(vious command is used as the e)-.25 F -.15(ve)-.25 G(nt,).15 E(equi)108 +398.4 Q -.25(va)-.25 G(lent to).25 E F4(!!)2.5 E F1(.)A F4(Modi\214ers) +87 415.2 Q F1 .47(After the optional w)108 427.2 R .47(ord designator) +-.1 F 2.97(,t)-.4 G .47(he e)-2.97 F .469 +(xpansion may include a sequence of one or more of the follo)-.15 F +(wing)-.25 E(modi\214ers, each preceded by a \231:\232.)108 439.2 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 +(nt.).15 E F4(h)108 456 Q F1(Remo)144 456 Q .3 -.15(ve a t)-.15 H +(railing \214lename component, lea).15 E(ving only the head.)-.2 E F4(t) +108 468 Q F1(Remo)144 468 Q .3 -.15(ve a)-.15 H +(ll leading \214lename components, lea).15 E(ving the tail.)-.2 E F4(r) +108 480 Q F1(Remo)144 480 Q .3 -.15(ve a t)-.15 H(railing suf).15 E +(\214x of the form)-.25 E F0(.xxx)2.5 E F1 2.5(,l)C(ea)-2.5 E +(ving the basename.)-.2 E F4(e)108 492 Q F1(Remo)144 492 Q .3 -.15(ve a) +-.15 H(ll b).15 E(ut the trailing suf)-.2 E(\214x.)-.25 E F4(p)108 504 Q +F1(Print the ne)144 504 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 F4(q)108 516 Q F1 +(Quote the substituted w)144 516 Q +(ords, escaping further substitutions.)-.1 E F4(x)108 528 Q F1 .385 +(Quote the substituted w)144 528 R .385(ords as with)-.1 F F4(q)2.885 E +F1 2.885(,b)C .386(ut break into w)-3.085 F .386(ords at)-.1 F F4 +(blanks)2.886 E F1 .386(and ne)2.886 F 2.886(wlines. The)-.25 F F4(q) +2.886 E F1(and)2.886 E F4(x)2.886 E F1(modi\214ers are mutually e)144 +540 Q(xclusi)-.15 E -.15(ve)-.25 G 2.5(;e).15 G +(xpansion uses the last one supplied.)-2.65 E F4(s/)108 552 Q F0(old)A +F4(/)A F0(ne)A(w)-.15 E F4(/)A F1(Substitute)144 564 Q F0(ne)3.329 E(w) +-.15 E F1 .469(for the \214rst occurrence of)3.279 F F0(old)3.199 E F1 +.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 .294 +(delimiter in place of /.)144 576 R .295 (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 +5.294 F -.15(ve)-.25 G .295(nt line.).15 F(A)5.295 E .229 +(single backslash quotes the delimiter in)144 588 R F0(old)2.959 E F1 +(and)3.498 E F0(ne)3.088 E(w)-.15 E F1 5.228(.I).31 G 2.728(f&a)-5.228 G +.228(ppears in)-2.728 F F0(ne)3.088 E(w)-.15 E F1 2.728(,i).31 G 2.728 +(ti)-2.728 G 2.728(sr)-2.728 G .228(eplaced with)-2.728 F F0(old)2.958 E +F1(.).77 E 2.986(As)144 600 S .486(ingle backslash quotes the &.)-2.986 +F(If)5.486 E F0(old)3.216 E F1 .486(is null, it is set to the last)3.756 +F F0(old)3.216 E F1 .487(substituted, or)3.756 F 2.987(,i)-.4 G 2.987 +(fn)-2.987 G 2.987(op)-2.987 G(re)-2.987 E(vi-)-.25 E 1.09 +(ous history substitutions took place, the last)144 612 R F0(string)3.93 +E F1 1.09(in a)3.81 F F4(!?)3.59 E F0(string)A F4([?])A F1 3.59 +(search. If)6.09 F F0(ne)3.95 E(w)-.15 E F1 1.09(is null, each)3.9 F +(matching)144 624 Q F0(old)2.73 E F1(is deleted.)3.27 E F4(&)108 636 Q +F1(Repeat the pre)144 636 Q(vious substitution.)-.25 E F4(g)108 648 Q F1 +.267(Cause changes to be applied o)144 648 R -.15(ve)-.15 G 2.767(rt).15 +G .267(he entire e)-2.767 F -.15(ve)-.25 G .267(nt line.).15 F .267 +(This is used in conjunction with \231)5.267 F F4(:s)A F1 2.768<9a28>C +(e.g.,)-2.768 E<99>144 660 Q F4(:gs/)A F0(old)A F4(/)A F0(ne)A(w)-.15 E +F4(/)A F1(\232\) or \231)A F4(:&)A F1 2.5(\232. If)B(used with \231)2.5 +E F4(:s)A F1(\232, an)A 2.5(yd)-.15 G +(elimiter can be used in place of /, and the \214nal de-)-2.5 E +(limiter is optional if it is the last character of the e)144 672 Q -.15 +(ve)-.25 G(nt line.).15 E(An)5 E F4(a)2.5 E F1(may be used as a synon) +2.5 E(ym for)-.15 E F4(g)2.5 E F1(.)A F4(G)108 684 Q F1(Apply the follo) +144 684 Q(wing \231)-.25 E F4(s)A F1 2.5<9a6f>C 2.5<7299>-2.5 G F4(&) +-2.5 E F1 2.5<9a6d>C(odi\214er once to each w)-2.5 E(ord in the e)-.1 E +-.15(ve)-.25 G(nt line.).15 E/F5 10.95/Times-Bold@0 SF(PR)72 700.8 Q +(OGRAMMING WITH HIST)-.329 E(OR)-.197 E 2.738(YF)-.383 G(UNCTIONS)-2.738 +E F1(This section describes ho)108 712.8 Q 2.5(wt)-.25 G 2.5(ou)-2.5 G +(se the History library in other programs.)-2.5 E(GNU History 8.3)72 768 +Q(2024 December 31)126.795 E(2)190.955 E 0 Cg EP +%%Page: 3 3 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Italic@0 SF(HIST)72.58 48 Q(OR)-.18 E(Y)-.18 E/F1 10 +/Times-Roman@0 SF 125.855(\(3\) Library)1.27 F(Functions Manual)2.5 E F0 +(HIST)128.935 E(OR)-.18 E(Y)-.18 E F1(\(3\))1.27 E/F2 10/Times-Bold@0 SF +(Intr)87 84 Q(oduction to History)-.18 E F1 2.883(Ap)108 96 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 +(sociating arbitrary data with a line, remo)108 108 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 +-.15 F .303(taining an arbitrary te)108 120 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 +.303(ddition, a history)-2.803 F F0 -.2(ex)2.802 G(pansion).2 E F1 +(function is a)108 132 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 +History library has the bene\214t of a consistent user interf)108 148.8 +R .059(ace with a)-.1 F .918(set of well-kno)108 160.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\ +G(om-)-3.417 E 4.183(mands. The)108 172.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) +1.684(vided by)-.15 F F2(bash)108 184.8 Q F1(.)A 1.154 +(The programmer can also use the readline library)108 201.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 +(ault,)-.1 E(and has the added adv)108 213.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 +230.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 +(cation writer should include the \214le)108 242.4 R F0()-.55 E F1 .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 +(eatures.)-2.566 E .538(It supplies e)108 254.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 +-.25 F(public data structures.)108 266.4 Q F2(History Storage)87 283.2 Q +F1(The history list is an array of history entries.)108 295.2 Q 2.5(Ah)5 +G(istory entry is declared as follo)-2.5 E(ws:)-.25 E F0(typedef void *) +108 312 Q F2(histdata_t;)2.5 E/F3 10/Courier@0 SF +(typedef struct _hist_entry {)108 328.8 Q(char *line;)120 340.8 Q +(char *timestamp;)120 352.8 Q(histdata_t data;)120 364.8 Q 6(}H)108 +376.8 S(IST_ENTRY;)-6 E F1 +(The history list itself might therefore be declared as)108 393.6 Q F0 +(HIST_ENTR)108 410.4 Q 2.5(Y*)-.18 G(*)-2.5 E F2(the_history_list;)2.5 E +F1(The state of the History library is encapsulated into a single struc\ +ture:)108 427.2 Q F3(/*)108 444 Q 6(*As)114 456 S +(tructure used to pass around the current state of the history.)-6 E(*/) +114 468 Q(typedef struct _hist_state {)108 480 Q +(HIST_ENTRY **entries; /* Pointer to entry records. */)120 492 Q +(int offset;)120 504 Q(/* The current record. */)66 E(int length;)120 +516 Q(/* Number of records in list. */)66 E(int size;)120 528 Q +(/* Number of records allocated. */)78 E(int flags;)120 540 Q 6(}H)108 +552 S(ISTORY_STATE;)-6 E F1(If the \215ags member includes)108 568.8 Q +F2(HS_STIFLED)2.5 E F1 2.5(,t)C(he history has been sti\215ed.)-2.5 E/F4 +10.95/Times-Bold@0 SF(History Functions)72 585.6 Q F1 +(This section describes the calling sequence for the v)108 597.6 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 +-.65 E F2(Initializing History and State Management)87 614.4 Q F1 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 +te of the History library when you)108 626.4 R -.1(wa)108 638.4 S +(nt to use the history functions in your program.).1 E F0(void)108 655.2 +Q F2(using_history)2.5 E F1(\()4.166 E F0(void)A F1(\))1.666 E(Be)108 +667.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 +F0(HIST)108 684 Q(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5(E*).37 G F2 +(history_get_history_state)A F1(\()4.166 E F0(void)A F1(\))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 +108 696 Q(.)-.65 E F0(void)108 712.8 Q F2(history_set_history_state)2.5 +E F1(\()4.166 E F0(HIST)A(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5(E*).37 +G(state)-2.5 E F1(\))1.666 E +(Set the state of the history list according to)108 724.8 Q F0(state)2.5 +E F1(.)A(GNU History 8.3)72 768 Q(2024 December 31)126.795 E(3)190.955 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 +/F0 10/Times-Italic@0 SF(HIST)72.58 48 Q(OR)-.18 E(Y)-.18 E/F1 10 +/Times-Roman@0 SF 125.855(\(3\) Library)1.27 F(Functions Manual)2.5 E F0 +(HIST)128.935 E(OR)-.18 E(Y)-.18 E F1(\(3\))1.27 E/F2 10/Times-Bold@0 SF +(History List Management)87 84 Q F1(These functions manage indi)108 96 Q +(vidual entries on the history list, or set parameters managing the lis\ +t itself.)-.25 E F0(void)108 112.8 Q F2(add_history)2.5 E F1(\()4.166 E +F0(const c)A(har *string)-.15 E F1(\))1.666 E(Place)108 124.8 Q F0 +(string)3.279 E F1 .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 +F2(NULL)3.279 E F1 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 136.8 R F2 +(sti\215e_history\(\))3.286 E F1 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 148.8 +S(uld e).1 E(xceed that maximum, the oldest history entry is remo)-.15 E +-.15(ve)-.15 G(d.).15 E F0(void)108 165.6 Q F2(add_history_time)2.5 E F1 +(\()4.166 E F0(const c)A(har *string)-.15 E F1(\))1.666 E +(Change the time stamp associated with the most recent history entry to) +108 177.6 Q F0(string)2.5 E F1(.)A F0(HIST_ENTR)108 194.4 Q 2.5(Y*)-.18 +G F2 -.18(re)C(mo).18 E -.1(ve)-.1 G(_history).1 E F1(\()4.166 E F0 +(int whic)A(h)-.15 E F1(\))1.666 E(Remo)108 206.4 Q .352 -.15(ve h)-.15 +H .052(istory entry at of).15 F(fset)-.25 E F0(whic)2.553 E(h)-.15 E F1 +.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(line, data, and containing structure.)108 218.4 Q F0 +(histdata_t)108 235.2 Q F2(fr)2.5 E(ee_history_entry)-.18 E F1(\()4.166 +E F0(HIST_ENTR)A 2.5(Y*)-.18 G(histent)-2.5 E F1(\))1.666 E .934 +(Free the history entry)108 247.2 R F0(histent)3.433 E F1 .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 259.2 Q F0 +(HIST_ENTR)108 276 Q 2.5(Y*)-.18 G F2 -.18(re)C(place_history_entry).18 +E F1(\()4.166 E F0(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 F1(\))3.332 E +(Mak)108 288 Q 3.062(et)-.1 G .562(he history entry at of)-3.062 F(fset) +-.25 E F0(whic)3.062 E(h)-.15 E F1(ha)3.062 E -.15(ve)-.2 G F0(line) +3.212 E F1(and)3.062 E F0(data)3.062 E F1 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 +108 300 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 F0(whic)2.5 E(h)-.15 E +F1 2.5(,a)C F2(NULL)A F1(pointer is returned.)2.5 E F0(void)108 316.8 Q +F2(clear_history)2.5 E F1(\()4.166 E F0(void)A F1(\))1.666 E +(Clear the history list by deleting all the entries.)108 328.8 Q F0 +(void)108 345.6 Q F2(sti\215e_history)2.5 E F1(\()4.166 E F0(int max)A +F1(\))1.666 E .38(Sti\215e the history list, remembering only the last) +108 357.6 R F0(max)2.88 E F1 2.88(entries. The)2.88 F .38 +(history list will contain only)2.88 F F0(max)2.88 E F1(entries)2.88 E +(at a time.)108 369.6 Q F0(int)108 386.4 Q F2(unsti\215e_history)2.5 E +F1(\()4.166 E F0(void)A F1(\))1.666 E .46(Stop sti\215ing the history) +108 398.4 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 +(sti-)2.96 E(\215e_history\(\))108 410.4 Q F1 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 F0(int)108 427.2 Q F2 +(history_is_sti\215ed)2.5 E F1(\()4.166 E F0(void)A F1(\))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\ +439.2 Q F2(Inf)87 456 Q(ormation About the History List)-.25 E F1(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 +468 Q(vidual list entries.)-.25 E F0(HIST_ENTR)108 484.8 Q 2.5(Y*)-.18 G +(*)-2.5 E F2(history_list)2.5 E F1(\()4.166 E F0(void)A F1(\))1.666 E +.708(Return a)108 496.8 R F2(NULL)3.208 E F1 .708(terminated array of) +3.208 F F0(HIST_ENTR)3.208 E 3.208(Y*)-.18 G F1 .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.) +(lement 0 of this)-5.707 F(list is the be)108 508.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 +E F1(.)A F0(int)108 525.6 Q F2(wher)2.5 E(e_history)-.18 E F1(\()4.166 E +F0(void)A F1(\))1.666 E(Returns the of)108 537.6 Q +(fset of the current history element.)-.25 E F0(HIST_ENTR)108 554.4 Q +2.5(Y*)-.18 G F2(curr)A(ent_history)-.18 E F1(\()4.166 E F0(void)A F1 (\))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) +566.4 R F2(wher)3.873 E(e_history\(\))-.18 E F1 6.373(.I)C 3.873(ft) +-6.373 G 1.374(here is no entry)-3.873 F(there, return a)108 578.4 Q F2 +(NULL)2.5 E F1(pointer)2.5 E(.)-.55 E F0(HIST_ENTR)108 595.2 Q 2.5(Y*) +-.18 G F2(history_get)A F1(\()4.166 E F0(int of)A(fset)-.18 E F1(\)) +1.666 E 1.069(Return the history entry at position)108 607.2 R F0(of) +3.569 E(fset)-.18 E F1 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 F0(of)3.569 E(fset)-.18 E F1 1.068 +(starts at)3.569 F F2(history_base)3.568 E F1(and)3.568 E .286(ends at) +108 619.2 R F2(history_length)2.786 E F1 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 +F0(of)2.786 E(fset)-.18 E F1 .286(is outside the v)2.786 F .287 +(alid range, return a)-.25 F F2(NULL)2.787 E F1(pointer)108 631.2 Q(.) +-.55 E F0(time_t)108 648 Q F2(history_get_time)2.5 E F1(\()4.166 E F0 +(HIST_ENTR)A 2.5(Y*)-.18 G F1(\))-.834 E(Return the time stamp associat\ +ed with the history entry passed as the ar)108 660 Q(gument.)-.18 E F0 +(int)108 676.8 Q F2(history_total_bytes)2.5 E F1(\()4.166 E F0(void)A F1 (\))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 +108 688.8 R .391(This function returns the sum of the)5.392 F +(lengths of all the lines in the history)108 700.8 Q(.)-.65 E +(GNU History 8.3)72 768 Q(2024 December 31)126.795 E(4)190.955 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 +/F0 10/Times-Italic@0 SF(HIST)72.58 48 Q(OR)-.18 E(Y)-.18 E/F1 10 +/Times-Roman@0 SF 125.855(\(3\) Library)1.27 F(Functions Manual)2.5 E F0 +(HIST)128.935 E(OR)-.18 E(Y)-.18 E F1(\(3\))1.27 E/F2 10/Times-Bold@0 SF +(Mo)87 84 Q(ving Ar)-.1 E(ound the History List)-.18 E F1 +(These functions allo)108 96 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 F0(int)108 +112.8 Q F2(history_set_pos)2.5 E F1(\()4.166 E F0(int pos)A F1(\))1.666 +E .79(Set the current history of)108 124.8 R .79(fset to)-.25 F F0(pos) +3.29 E F1 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 +F0(pos)3.29 E F1 .79(is less)3.29 F +(than zero or greater than the number of history entries.)108 136.8 Q F0 +(HIST_ENTR)108 153.6 Q 2.5(Y*)-.18 G F2(pr)A -.15(ev)-.18 G +(ious_history).15 E F1(\()4.166 E F0(void)A F1(\))1.666 E .208 +(Back up the current history of)108 165.6 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 +-5.207 G .207(here is)-2.707 F(no pre)108 177.6 Q(vious entry)-.25 E 2.5 +(,r)-.65 G(eturn a)-2.5 E F2(NULL)2.5 E F1(pointer)2.5 E(.)-.55 E F0 +(HIST_ENTR)108 194.4 Q 2.5(Y*)-.18 G F2(next_history)A F1(\()4.166 E F0 +(void)A F1(\))1.666 E .332(If the current history of)108 206.4 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 +.333(the possi-)2.833 F .202(bly-incremented history of)108 218.4 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 +230.4 Q F2(NULL)2.5 E F1(pointer)2.5 E(.)-.55 E F2(Sear)87 247.2 Q +(ching the History List)-.18 E F1 .005(These functions allo)108 259.2 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 +(performed both forw)108 271.2 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 +6.451 F F0(anc)3.951 E(hor)-.15 E(ed)-.37 E F1(,)A +(meaning that the string must match at the be)108 283.2 Q +(ginning of the history entry)-.15 E(.)-.65 E F0(int)108 300 Q F2 +(history_sear)2.5 E(ch)-.18 E F1(\()4.166 E F0(const c)A(har *string) +-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection)-.37 E F1(\))1.666 E .155 +(Search the history for)108 312 R F0(string)2.655 E F1 2.656(,s)C .156 +(tarting at the current history of)-2.656 F 2.656(fset. If)-.25 F F0 +(dir)2.656 E(ection)-.37 E F1 .156(is less than 0, then the search)2.656 +F .802(is through pre)108 324 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 +F0(string)3.301 E F1 .801(is found, then the current his-)3.301 F .064 +(tory inde)108 336 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 +(fset in the line of the entry where)-.25 F F0(string)2.565 E F1 -.1(wa) +108 348 S 2.5(sf).1 G 2.5(ound. Otherwise,)-2.5 F +(nothing is changed, and the function returns \2551.)2.5 E F0(int)108 +364.8 Q F2(history_sear)2.5 E(ch_pr)-.18 E(e\214x)-.18 E F1(\()4.166 E +F0(const c)A(har *string)-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection) +-.37 E F1(\))1.666 E .684(Search the history for)108 376.8 R F0(string) +3.183 E F1 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 F0(string)3.563 E F1 +6.063(.I)C(f)-6.063 E F0(dir)3.563 E(ection)-.37 E F1 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 +400.8 R(If)5.34 E F0(string)2.84 E F1 .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 +(Otherwise, nothing is changed, and the function returns \2551.)5 E F0 +(int)108 429.6 Q F2(history_sear)2.5 E(ch_pos)-.18 E F1(\()4.166 E F0 +(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 F1(\))3.332 E .603(Search for)108 441.6 R +F0(string)3.103 E F1 .603(in the history list, starting at)3.103 F F0 +(pos)3.104 E F1 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 F0(dir)3.104 E +(ection)-.37 E F1 .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 453.6 R .608(ard from) +-.1 F F0(pos)3.108 E F1 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 465.6 Q F0 +(string)2.5 E F1 -.1(wa)2.5 G 2.5(sf).1 G(ound, or \2551 otherwise.)-2.5 +E F2(Managing the History File)87 482.4 Q F1 .035(The History library c\ +an read the history from and write it to a \214le.)108 494.4 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 +(managing a history \214le.)108 506.4 Q F0(int)108 523.2 Q F2 -.18(re) +2.5 G(ad_history).18 E F1(\()4.166 E F0(const c)A(har *\214lename)-.15 E +F1(\))1.666 E .052(Add the contents of)108 535.2 R F0(\214lename)2.552 E +F1 .052(to the history list, a line at a time.)2.552 F(If)5.051 E F0 +(\214lename)2.551 E F1(is)2.551 E F2(NULL)2.551 E F1 2.551(,t)C .051 +(hen read from)-2.551 F F0(\001/.his-)2.551 E(tory)108 547.2 Q F1 5(.R)C +(eturns 0 if successful, or)-5 E F2(err)2.5 E(no)-.15 E F1(if not.)2.5 E +F0(int)108 564 Q F2 -.18(re)2.5 G(ad_history_range).18 E F1(\()4.166 E +F0(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 F1(\))3.332 E .052(Read a range of lines from) +108 576 R F0(\214lename)2.553 E F1 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 +5.053 F F0(fr)2.553 E(om)-.45 E F1 .053(and end at)2.553 F F0(to)2.553 E +F1(.)A(If)108 588 Q F0(fr)2.889 E(om)-.45 E F1 .389 +(is zero, start at the be)2.889 F 2.889(ginning. If)-.15 F F0(to)2.889 E +F1 .389(is less than)2.889 F F0(fr)2.889 E(om)-.45 E F1 2.889(,t)C .388 +(hen read until the end of the \214le.)-2.889 F(If)5.388 E F0 +(\214lename)2.888 E F1(is)108 600 Q F2(NULL)2.5 E F1 2.5(,t)C +(hen read from)-2.5 E F0(\001/.history)2.5 E F1 5(.R)C +(eturns 0 if successful, or)-5 E F2(err)2.5 E(no)-.15 E F1(if not.)2.5 E +F0(int)108 616.8 Q F2(write_history)2.5 E F1(\()4.166 E F0(const c)A +(har *\214lename)-.15 E F1(\))1.666 E .961(Write the current history to) +108 628.8 R F0(\214lename)3.461 E F1 3.461(,o)C -.15(ve)-3.611 G +(rwriting).15 E F0(\214lename)3.461 E F1 .961(if necessary)3.461 F 5.961 +(.I)-.65 G(f)-5.961 E F0(\214lename)3.462 E F1(is)3.462 E F2(NULL)3.462 +E F1 3.462(,t)C .962(hen write)-3.462 F(the history list to)108 640.8 Q +F0(\001/.history)2.5 E F1 5(.R)C(eturns 0 on success, or)-5 E F2(err)2.5 +E(no)-.15 E F1(on a read or write error)2.5 E(.)-.55 E F0(int)108 657.6 +Q F2(append_history)2.5 E F1(\()4.166 E F0(int nelements,)A(const c) +1.666 E(har *\214lename)-.15 E F1(\))1.666 E .717(Append the last)108 +669.6 R F0(nelements)3.217 E F1 .717(of the history list to)3.217 F F0 +(\214lename)3.216 E F1 5.716(.I)C(f)-5.716 E F0(\214lename)3.216 E F1 +(is)3.216 E F2(NULL)3.216 E F1 3.216(,t)C .716(hen append to)-3.216 F F0 +(\001/.history)3.216 E F1(.)A(Returns 0 on success, or)108 681.6 Q F2 +(err)2.5 E(no)-.15 E F1(on a read or write error)2.5 E(.)-.55 E F0(int) +108 698.4 Q F2(history_truncate_\214le)2.5 E F1(\()4.166 E F0(const c)A +(har *\214lename)-.15 E 1.666(,i)-.1 G(nt nlines)-1.666 E F1(\))1.666 E +-.35(Tr)108 710.4 S .258(uncate the history \214le).35 F F0(\214lename) +2.758 E F1 2.758(,l)C(ea)-2.758 E .258(ving only the last)-.2 F F0 +(nlines)2.758 E F1 2.758(lines. If)2.758 F F0(\214lename)2.758 E F1(is) +2.758 E F2(NULL)2.759 E F1 2.759(,t)C(hen)-2.759 E F0(\001/.history) +2.759 E F1(is)2.759 E 2.5(truncated. Returns)108 722.4 R 2.5(0o)2.5 G +2.5(ns)-2.5 G(uccess, or)-2.5 E F2(err)2.5 E(no)-.15 E F1(on f)2.5 E +(ailure.)-.1 E(GNU History 8.3)72 768 Q(2024 December 31)126.795 E(5) +190.955 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 +/F0 10/Times-Italic@0 SF(HIST)72.58 48 Q(OR)-.18 E(Y)-.18 E/F1 10 +/Times-Roman@0 SF 125.855(\(3\) Library)1.27 F(Functions Manual)2.5 E F0 +(HIST)128.935 E(OR)-.18 E(Y)-.18 E F1(\(3\))1.27 E/F2 10/Times-Bold@0 SF +(History Expansion)87 84 Q F1(These functions implement history e)108 96 +Q(xpansion.)-.15 E F0(int)108 112.8 Q F2(history_expand)2.5 E F1(\() +4.166 E F0(const c)A(har *string)-.15 E 1.666(,c)-.1 G(har **output) +-1.816 E F1(\))1.666 E(Expand)108 124.8 Q F0(string)2.5 E F1 2.5(,p)C +(lacing the result into)-2.5 E F0(output)2.5 E F1 2.5(,ap)C +(ointer to a string.)-2.5 E(Returns:)5 E(0)144 136.8 Q .566(If no e)180 +136.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 148.8 Q +(xpansion character\);)-.15 E(1)144 160.8 Q(if e)180 160.8 Q +(xpansions did tak)-.15 E 2.5(ep)-.1 G(lace;)-2.5 E144 172.8 Q +(if there w)180 172.8 Q(as an error in e)-.1 E(xpansion;)-.15 E(2)144 +184.8 Q(if the returned line should be displayed, b)180 184.8 Q +(ut not e)-.2 E -.15(xe)-.15 G(cuted, as with the).15 E F2(:p)2.5 E F1 +(modi\214er)2.5 E(.)-.55 E(If an error occurred in e)108 196.8 Q +(xpansion, then)-.15 E F0(output)2.5 E F1(contains a descripti)2.5 E .3 +-.15(ve e)-.25 H(rror message.).15 E F0 -.15(ch)108 213.6 S(ar *).15 E +F2(get_history_e)2.5 E -.1(ve)-.15 G(nt).1 E F1(\()4.166 E F0(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 F1(\))3.332 E .262(Returns the te)108 225.6 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 +(ginning at)-.15 F F0(string)2.763 E F1(+)2.763 E F0(*cinde)2.763 E(x) +-.2 E F1(.)A F0(*cinde)5.263 E(x)-.2 E F1 .263 +(is modi\214ed to point to after the)2.763 F -2.15 -.25(ev e)108 237.6 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 +(unction entry)-3.21 F(,)-.65 E F0(cinde)3.21 E(x)-.2 E F1 .709 +(points to the inde)3.21 F 3.209(xi)-.15 G(nto)-3.209 E F0(string)3.209 +E F1 .709(where the history e)3.209 F -.15(ve)-.25 G .709 +(nt speci\214ca-).15 F .691(tion be)108 249.6 R(gins.)-.15 E F0(qc)5.691 +E(har)-.15 E F1 .691(is a character that is allo)3.191 F .692 +(wed to end the e)-.25 F -.15(ve)-.25 G .692 +(nt speci\214cation in addition to the \231normal\232).15 F +(terminating characters.)108 261.6 Q F0 -.15(ch)108 278.4 S(ar **).15 E +F2(history_tok)2.5 E(enize)-.1 E F1(\()4.166 E F0(const c)A(har *string) +-.15 E F1(\))1.666 E .239(Return an array of tok)108 290.4 R .239 +(ens parsed out of)-.1 F F0(string)2.739 E F1 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 +(ens are split on the charac-)-.1 F(ters in the)108 302.4 Q F2 +(history_w)2.5 E(ord_delimiters)-.1 E F1 -.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 +(yed.)-.15 E F0 -.15(ch)108 319.2 S(ar *).15 E F2(history_ar)2.5 E +(g_extract)-.1 E F1(\()4.166 E F0(int \214r)A -.834(st, int)-.1 F -.834 +(last, const)2.5 F -.15(ch)2.5 G(ar *string).15 E F1(\))3.332 E .025 +(Extract a string se)108 331.2 R .025(gment consisting of the)-.15 F F0 +<8c72>2.526 E(st)-.1 E F1(through)2.526 E F0(last)2.526 E F1(ar)2.526 E +.026(guments present in)-.18 F F0(string)2.526 E F1 5.026(.A)C -.18(rg) +-5.026 G .026(uments are split).18 F(using)108 343.2 Q F2(history_tok) +2.5 E(enize\(\))-.1 E F1(.)A F2(History V)87 360 Q(ariables)-.92 E F1 +(This section describes the e)108 372 Q(xternally-visible v)-.15 E +(ariables e)-.25 E(xported by the GNU History Library)-.15 E(.)-.65 E F0 +(int)108 388.8 Q F2(history_base)2.5 E F1(The logical of)108 400.8 Q +(fset of the \214rst entry in the history list.)-.25 E F0(int)108 417.6 +Q F2(history_length)2.5 E F1 +(The number of entries currently stored in the history list.)108 429.6 Q +F0(int)108 446.4 Q F2(history_max_entries)2.5 E F1 +(The maximum number of history entries.)108 458.4 Q +(This must be changed using)5 E F2(sti\215e_history\(\))2.5 E F1(.)A F0 +(int)108 475.2 Q F2(history_write_timestamps)2.5 E F1 .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 +487.2 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 499.2 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 +(current timestamp format uses the v)3.494 F .995(alue of)-.25 F F0 +(history_comment_c)108 511.2 Q(har)-.15 E F1 .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 +H(alue)-.1 E(\(the def)108 523.2 Q +(ault\), the history library will not write timestamps.)-.1 E F0 -.15 +(ch)108 540 S(ar).15 E F2(history_expansion_char)2.5 E F1 +(The character that introduces a history e)108 552 Q -.15(ve)-.25 G 2.5 +(nt. The).15 F(def)2.5 E(ault is)-.1 E F2(!)2.5 E F1 5(.S)C +(etting this to 0 inhibits history e)-5 E(xpansion.)-.15 E F0 -.15(ch) +108 568.8 S(ar).15 E F2(history_subst_char)2.5 E F1 +(The character that in)108 580.8 Q -.2(vo)-.4 G -.1(ke).2 G 2.5(sw).1 G (ord substitution if found at the start of a line.)-2.6 E(The def)5 E -(ault is)-.1 E/F1 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 +(ault is)-.1 E F2<00>2.5 E F1(.)A F0 -.15(ch)108 597.6 S(ar).15 E F2 +(history_comment_char)2.5 E F1 .116(During tok)108 609.6 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 +(acters up to a ne)108 621.6 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 +F(abled by def)108 633.6 Q(ault.)-.1 E F0 -.15(ch)108 650.4 S(ar *).15 E +F2(history_w)2.5 E(ord_delimiters)-.1 E F1 +(The characters that separate tok)108 662.4 Q(ens for)-.1 E F2 +(history_tok)2.5 E(enize\(\))-.1 E F1 5(.T)C(he def)-5 E(ault v)-.1 E +(alue is)-.25 E F2 2.5("\\)2.5 G(t\\n\(\)<>;&|")-2.5 E F1(.)A F0 -.15 +(ch)108 679.2 S(ar *).15 E F2(history_no_expand_chars)2.5 E F1 2.054 +(The list of characters which inhibit history e)108 691.2 R 2.054 +(xpansion if found immediately follo)-.15 F(wing)-.25 E F2 +(history_expan-)4.555 E(sion_char)108 703.2 Q F1 5(.T)C(he def)-5 E +(ault is space, tab, ne)-.1 E(wline,)-.25 E F2(\\r)2.5 E F1 2.5(,a)C(nd) +-2.5 E F2(=)2.5 E F1(.)A F0 -.15(ch)108 720 S(ar *).15 E F2 +(history_sear)2.5 E(ch_delimiter_chars)-.18 E F1(GNU History 8.3)72 768 +Q(2024 December 31)126.795 E(6)190.955 E 0 Cg EP +%%Page: 7 7 +%%BeginPageSetup +BP +%%EndPageSetup +/F0 10/Times-Italic@0 SF(HIST)72.58 48 Q(OR)-.18 E(Y)-.18 E/F1 10 +/Times-Roman@0 SF 125.855(\(3\) Library)1.27 F(Functions Manual)2.5 E F0 +(HIST)128.935 E(OR)-.18 E(Y)-.18 E F1(\(3\))1.27 E .401(The list of add\ +itional characters which can delimit a history search string, in additi\ +on to space, tab,)108 84 R F0(:)2.901 E F1(and)2.901 E F0(?)2.901 E F1 +(in the case of a substring search.)108 96 Q(The def)5 E(ault is empty) +-.1 E(.)-.65 E F0(int)108 112.8 Q/F2 10/Times-Bold@0 SF +(history_quotes_inhibit_expansion)2.5 E F1 .185 +(If non-zero, the history e)108 124.8 R .185 +(xpansion code implements shell-lik)-.15 F 2.685(eq)-.1 G .186 +(uoting: single-quoted w)-2.685 F .186(ords are not scanned)-.1 F .837 +(for the history e)108 136.8 R .837 +(xpansion character or the history comment character)-.15 F 3.336(,a)-.4 +G .836(nd double-quoted w)-3.336 F .836(ords may ha)-.1 F -.15(ve)-.2 G +.244(history e)108 148.8 R .245(xpansion performed, since single quotes\ + are not special within double quotes.)-.15 F .245(The def)5.245 F .245 +(ault v)-.1 F .245(alue is)-.25 F(0.)108 160.8 Q F0(int)108 177.6 Q F2 +(history_quoting_state)2.5 E F1 .79(An application may set this v)108 +189.6 R .79(ariable to indicate that the current line being e)-.25 F .79 +(xpanded is subject to e)-.15 F(xisting)-.15 E 3.326(quoting. If)108 +201.6 R .826(set to)3.326 F F0<08>3.326 E F1 3.326(,h)C .826(istory e) +-3.326 F .827 +(xpansion assumes that the line is single-quoted and inhibit e)-.15 F +.827(xpansion until it)-.15 F .088 +(reads an unquoted closing single quote; if set to)108 213.6 R F0(") +2.588 E F1 2.588(,h)C .088(istory e)-2.588 F .087 +(xpansion assumes the line is double quoted until)-.15 F .405 +(it reads an unquoted closing double quote.)108 225.6 R .406 +(If set to zero, the def)5.405 F .406(ault, history e)-.1 F .406 +(xpansion assumes the line is)-.15 F 1.436(not quoted and treats quote \ +characters within the line as described abo)108 237.6 R -.15(ve)-.15 G +6.436(.T).15 G 1.436(his is only ef)-6.436 F(fecti)-.25 E 1.735 -.15 +(ve i)-.25 H(f).15 E F2(his-)3.935 E(tory_quotes_inhibit_expansion)108 +249.6 Q F1(is set.)2.5 E F0(rl_lineb)108 266.4 Q(uf_func_t *)-.2 E F2 +(history_inhibit_expansion_function)2.5 E F1 .347 +(This should be set to the address of a function that tak)108 278.4 R +.348(es tw)-.1 F 2.848(oa)-.1 G -.18(rg)-2.848 G .348(uments: a).18 F F2 +.348(char *)2.848 F F1(\()2.848 E F0(string)A F1 2.848(\)a)C .348(nd an) +-2.848 F F2(int)2.848 E F1(inde)2.848 E(x)-.15 E .228 +(into that string \()108 290.4 R F0(i)A F1 2.728(\). 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 +.227(xpansion starting at)-.15 F F0(string[i])2.727 E F1 .227 +(should not)2.727 F .019(be performed; zero if the e)108 302.4 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 +(It is intended for use by applications lik)5.019 F(e)-.1 E F2(bash) +2.519 E F1 .019(that use)2.519 F(the history e)108 314.4 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 +(ault, this v)-.1 E(ariable is set to)-.25 E F2(NULL)2.5 E F1(.)A/F3 +10.95/Times-Bold@0 SF(FILES)72 331.2 Q F0(\001/.history)109.666 343.2 Q +F1(Def)144 355.2 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 372 Q F0 +(The Gnu Readline Libr)108 384 Q(ary)-.15 E F1 2.5(,B)C(rian F)-2.5 E +(ox and Chet Rame)-.15 E(y)-.15 E F0(The Gnu History Libr)108 396 Q(ary) +-.15 E F1 2.5(,B)C(rian F)-2.5 E(ox and Chet Rame)-.15 E(y)-.15 E F0 +(bash)108 408 Q F1(\(1\))A F0 -.37(re)108 420 S(adline).37 E F1(\(3\))A +F3 -.548(AU)72 436.8 S(THORS).548 E F1(Brian F)108 448.8 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 +460.8 Q(g)-.18 E(Chet Rame)108 477.6 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 +(chet.rame)108 489.6 Q(y@case.edu)-.15 E F3 -.11(BU)72 506.4 S 2.738(GR) +.11 G(EPOR)-2.738 E(TS)-.438 E F1 .16(If you \214nd a b)108 518.4 R .16 +(ug in the)-.2 F F2(history)2.66 E F1(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 +2.66(es)-.1 G .16(ure that it really is)-2.66 F 2.5(ab)108 530.4 S +(ug, and that it appears in the latest v)-2.7 E(ersion of the)-.15 E F2 +(history)2.5 E F1(library that you ha)2.5 E -.15(ve)-.2 G(.).15 E .704 +(Once you ha)108 547.2 R 1.004 -.15(ve d)-.2 H .704(etermined that a b) +.15 F .704(ug actually e)-.2 F .704(xists, mail a b)-.15 F .705 +(ug report to)-.2 F F0 -.2(bu)3.205 G(g\255r).2 E(eadline)-.37 E F1(@)A +F0(gnu.or)A(g)-.37 E F1 5.705(.I)C 3.205(fy)-5.705 G(ou)-3.205 E(ha)108 +559.2 Q 1.679 -.15(ve a \214)-.2 H 1.379 +(x, you are welcome to mail that as well!).15 F 1.379 +(Suggestions and \231philosophical\232 b)6.379 F 1.378 +(ug reports may be)-.2 F(mailed to)108 571.2 Q F0 -.2(bu)2.5 G(g\255r).2 +E(eadline)-.37 E F1(@)A F0(gnu.or)A(g)-.37 E F1 +(or posted to the Usenet ne)2.5 E(wsgroup)-.25 E F2(gnu.bash.b)2.5 E(ug) +-.2 E F1(.)A(Comments and b)108 588 Q +(ug reports concerning this manual page should be directed to)-.2 E F0 +-.15(ch)2.5 G(et.r).15 E(ame)-.15 E(y@case)-.3 E(.edu)-.15 E F1(.).25 E +(GNU History 8.3)72 768 Q(2024 December 31)126.795 E(7)190.955 E 0 Cg EP %%Trailer end %%EOF diff --git a/doc/hstech.texi b/doc/hstech.texi index da6417b..82ff77c 100644 --- a/doc/hstech.texi +++ b/doc/hstech.texi @@ -1,7 +1,7 @@ @ignore This file documents the user interface to the GNU History library. -Copyright (C) 1988-2022 Free Software Foundation, Inc. +Copyright (C) 1988-2025 Free Software Foundation, Inc. Authored by Brian Fox and Chet Ramey. Permission is granted to make and distribute verbatim copies of this manual @@ -29,37 +29,41 @@ into another language, under the above conditions for modified versions. 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}. +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 Variables:: Variables that control behavior. * 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 +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 when composing new ones. + +A programmer using the History library can use functions +to save commands on a history list, +associate arbitrary data with history list entries, +remove entries from the list, +search through the list for a line containing an arbitrary text string, +reference any entry in the list directly, +and read and write the history list from and to a file. +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 +Someone 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 +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 @@ -69,15 +73,16 @@ 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. +History library's features. +It supplies 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: +The history list is an array of history entries. +A history entry is declared as follows: @example typedef void *histdata_t; @@ -111,7 +116,7 @@ typedef struct _hist_state @{ @end example If the flags member includes @code{HS_STIFLED}, the history has been -stifled. +stifled (limited to a maximum number of entries). @node History Functions @section History Functions @@ -145,8 +150,8 @@ 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. +Begin a session that will use the history functions. +This initializes the interactive variables. @end deftypefun @deftypefun {HISTORY_STATE *} history_get_history_state (void) @@ -164,11 +169,11 @@ 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}. +Add @var{string} to the end of the history list, and +set the associated data field (if any) 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. +@code{stifle_history()}, and the new number of history entries +would exceed that maximum, this removes the oldest history entry. @end deftypefun @deftypefun void add_history_time (const char *string) @@ -177,22 +182,25 @@ Change the time stamp associated with the most recent history entry to @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, +Remove the history entry at offset @var{which} from the history list. +This returns the removed element so you can free the line, data, and containing structure. +Since the data is private to your application, the History library +doesn't know how to free it, if necessary. @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 +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. +application-specific data. +In the case of an invalid @var{which}, this returns @code{NULL}. @end deftypefun @deftypefun void clear_history (void) @@ -205,10 +213,10 @@ 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. +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) @@ -223,18 +231,19 @@ 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}. +current input history. +Element 0 of this list is the beginning of time. +Return @code{NULL} if there is no history. @end deftypefun @deftypefun int where_history (void) -Returns the offset of the current history element. +Return the offset of the current history entry. @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. +@code{where_history()}. +If there is no entry there, return @code{NULL}. @end deftypefun @deftypefun {HIST_ENTRY *} history_get (int offset) @@ -243,7 +252,7 @@ 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. +range, return @code{NULL}. @end deftypefun @deftypefun time_t history_get_time (HIST_ENTRY *entry) @@ -272,8 +281,8 @@ than the number of history entries. @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. +return a pointer to that entry. +If there is no previous entry, return @code{NULL}. @end deftypefun @deftypefun {HIST_ENTRY *} next_history (void) @@ -281,45 +290,51 @@ 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. +otherwise, return @code{NULL}. @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. +These functions search 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 a 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. +If @var{string} is found, then the current history index is set to +that history entry, and @code{history_search} +returns the offset in the line of the entry where +@var{string} was found. +Otherwise, nothing is changed, and this returns -1. @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 +offset. +The search is anchored: matching history entries 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. +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 this returns -1. @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. +absolute index into the list. +If @var{direction} is negative, the search +proceeds backward from @var{pos}, otherwise forward. +Returns the index in the history list +of the history element where @var{string} was +found, or -1 otherwise. @end deftypefun @node Managing the History File @@ -329,23 +344,34 @@ 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}. +Add the contents of @var{filename} to the history list, one entry +at a time. +If @var{filename} is @code{NULL}, this reads from @file{~/.history}, +if it exists. +This attempts to determine whether the history file includes timestamp +information, and assigns timestamps to the history entries it reads +if so. 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. +If @var{from} is zero, start at the beginning. +If @var{to} is less than @var{from}, this reads until the end of the file. +This attempts to determine whether the history file includes timestamp +information, and assigns timestamps to the history entries it reads +if so. +If @var{filename} is @code{NULL}, this reads from @file{~/.history}, +if it exists. +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. +This writes timestamp information if the +@code{history_write_timestamps} variable is set to a non-zero value. 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. @@ -353,6 +379,8 @@ Returns 0 on success, or @code{errno} on a read or write error. @deftypefun int append_history (int nelements, const char *filename) Append the last @var{nelements} of the history list to @var{filename}. +This writes timestamp information if the +@code{history_write_timestamps} variable is set to a non-zero value. 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 @@ -360,7 +388,7 @@ Returns 0 on success, or @code{errno} on a read or write error. @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. +If @var{filename} is @code{NULL}, this truncates @file{~/.history}. Returns 0 on success, or @code{errno} on failure. @end deftypefun @@ -369,9 +397,10 @@ Returns 0 on success, or @code{errno} on failure. These functions implement history expansion. -@deftypefun int history_expand (char *string, char **output) +@deftypefun int history_expand (const char *string, char **output) Expand @var{string}, placing the result into @var{output}, a pointer -to a string (@pxref{History Interaction}). Returns: +to a string (@pxref{History Interaction}). +Returns: @table @code @item 0 If no expansions took place (or, if the only change in @@ -386,30 +415,33 @@ 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. +If an error occurred during 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} +@var{*cindex}. +Modifies @var{*cindex} 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 +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}. +arguments present in @var{string}. +This splits @var{string} into arguments using @code{history_tokenize}. @end deftypefun @node History Variables @@ -427,32 +459,35 @@ 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()}. +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. +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. +to delimit timestamp entries in the history file. +If that variable does not have a value (the default), +the history library will not write timestamps. @end deftypevar @deftypevar char history_expansion_char -The character that introduces a history event. The default is @samp{!}. +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{^}. +a line. +The default is @samp{^}. @end deftypevar @deftypevar char history_comment_char -During tokenization, if this character is seen as the first character +During tokenization, if this character appears 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. @@ -466,13 +501,14 @@ The default value is @code{" \t\n()<>;&|"}. @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. +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{=}. +following @var{history_expansion_char}. +The default is space, tab, newline, carriage return, and @samp{=}. @end deftypevar @deftypevar int history_quotes_inhibit_expansion @@ -486,14 +522,19 @@ The default value is 0. @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. +being expanded is subject to existing quoting. +If set to @samp{'}, +history expansion assumes that the line is single-quoted and +inhibit expansion until it reads an unquoted closing single quote; +if set to @samp{"}, +history expansion assumes the line is double quoted +until it reads an unquoted closing double quote. +If set to 0, the default, +history expansion assumes the line is not quoted and +treats quote characters within the line as described above. This is only effective if @var{history_quotes_inhibit_expansion} is set. +This is intended for use by applications like Bash which allow +quoted strings to span multiple lines. @end deftypevar @deftypevar {rl_linebuf_func_t *} history_inhibit_expansion_function @@ -517,9 +558,8 @@ The following program demonstrates simple use of the @sc{gnu} History Library. #include #include -main (argc, argv) - int argc; - char **argv; +int +main (int argc, char **argv) @{ char line[1024], *t; int len, done = 0; diff --git a/doc/hsuser.texi b/doc/hsuser.texi index 9081baf..5bce1c3 100644 --- a/doc/hsuser.texi +++ b/doc/hsuser.texi @@ -1,7 +1,7 @@ @ignore This file documents the user interface to the GNU History library. -Copyright (C) 1988--2022 Free Software Foundation, Inc. +Copyright (C) 1988--2025 Free Software Foundation, Inc. Authored by Brian Fox and Chet Ramey. Permission is granted to make and distribute verbatim copies of this manual @@ -38,9 +38,10 @@ 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, +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 @@ -70,59 +71,74 @@ 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. +number of commands to save in a history list: +the shell saves the text of the last @env{$HISTSIZE} +commands (default 500). 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 +When the shell starts up, Bash initializes the history list +by reading history entries 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 +This is referred to as the @dfn{history file}. +The history file is truncated, if necessary, +to contain no more than the number of history entries +specified by the value of the @env{HISTFILESIZE} variable. +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. + +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. +These timestamps are optionally displayed depending on the value of the +@env{HISTTIMEFORMAT} variable (@pxref{Bash Variables}). +When present, history timestamps delimit history entries, making +multi-line entries possible. + +When a shell with history enabled exits, Bash copies the last +@env{$HISTSIZE} entries 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. +Bash appends the entries to the history file, +otherwise it overwrites the history file. +If @env{HISTFILE} is unset or null, +or if the history file is unwritable, the history is not saved. +After saving the history, Bash truncates the history file +to contain no more than @env{$HISTFILESIZE} +lines as described above. + +If the @env{HISTTIMEFORMAT} +variable is set, the shell writes the timestamp information +associated with each history entry to the history file, +marked with the history comment character, +so timestamps are preserved across shell sessions. +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. +As above, when using @env{HISTTIMEFORMAT}, +the timestamps delimit multi-line history entries. + +The @code{fc} builtin command will list or edit and re-execute a +portion of the history list. +The @code{history} builtin can 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 +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 are used to save only a subset of the commands entered. +If the @code{cmdhist} shell option is +enabled, the shell attempts 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. +shell option modifies @code{cmdhist} by saving +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}. @@ -142,9 +158,9 @@ history list and history file. @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. +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 @@ -157,26 +173,44 @@ 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 +the current command for listing and to @var{first} otherwise. +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 supplied, +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, @code{fc} invokes the editor named by +@var{ename} on a file containing those commands. +If @var{ename} is not supplied, @code{fc} uses the value of the following +variable expansion: @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. +When editing is complete, @code{fc} reads the file of edited commands +and echoes and executes them. -In the second form, @var{command} is re-executed after each instance -of @var{pat} in the selected command is replaced by @var{rep}. +In the second form, @code{fc} re-executes @var{command} after +replacing each instance of @var{pat} in the selected command with @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}). +If the first form is used, the return value is zero unless an invalid +option is encountered or @var{first} or @var{last} +specify history lines out of range. +When editing and re-executing a file of commands, +the return value is the value of the last command executed +or failure if an error occurs with the temporary file. +If the second form is used, the return status +is that of the re-executed command, unless +@var{command} does not specify a valid history entry, in which case +@code{fc} returns a non-zero status. + @item history @btindex history @example @@ -188,21 +222,21 @@ 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. +With no options, display the history list with numbers. +Entries prefixed with a @samp{*} have been modified. +An argument of @var{n} lists only the last @var{n} entries. If the shell variable @env{HISTTIMEFORMAT} is set and not null, -it is used as a format string for @var{strftime} to display +it is used as a format string for @code{strftime}(3) 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. +If @code{history} uses @env{HISTTIMEFORMAT}, it does not print an +intervening space between the formatted time stamp and the history entry. 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. +Clear the history list. +This may be combined with the other options to replace the history list. @item -d @var{offset} Delete the history entry at position @var{offset}. @@ -220,36 +254,46 @@ 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. +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 +Read the history lines not already read from the history file +and add them 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. +Read the history file and append its contents to the history list. @item -w -Write out the current history list to the history file. +Write the current history list to the history file, overwriting +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. +Add the @var{arg}s to the end of the history list as a single entry. +The last command in the history list is removed before adding the @var{arg}s. @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. +with any of the @option{-w}, @option{-r}, @option{-a}, or @option{-n} +options, Bash uses @var{filename} as the history file. +If not, it uses the value of the @env{HISTFILE} variable. +If @env{HISTFILE} is unset or null, these options have no effect. + +If the @env{HISTTIMEFORMAT} +variable is set, @code{history} writes the time stamp information +associated with each history entry to the history file, +marked with the history comment character as described above. +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 return value is 0 unless an invalid option is encountered, an error occurs while reading or writing the history file, an invalid @@ -263,9 +307,25 @@ history expansion supplied as an argument to @option{-p} fails. @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. +@ifset BashFeatures +The shell +@end ifset +@ifclear BashFeatures +The History library +@end ifclear +provides a history expansion feature that is similar +to the history expansion provided by @code{csh} +(also referred to as history substitution where appropriate). +This section describes the syntax used to manipulate the +history information. + +@ifset BashFeatures +History expansion is enabled by default for interactive shells, +and can be disabled using the @option{+H} option to the @code{set} +builtin command (@pxref{The Set Builtin}). +Non-interactive shells do not perform history expansion by default, +but it can be enabled with @code{set -H}. +@end ifset History expansions introduce words from the history list into the input stream, making it easy to repeat commands, insert the @@ -275,21 +335,31 @@ 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 +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 expansion takes place in two parts. +The first is to determine +which entry from the history list should be used during substitution. +The second is to select portions of that entry to include into the +current one. + +The entry selected from the history is called the @dfn{event}, +and the portions of that entry that are acted upon are @dfn{words}. +Various @dfn{modifiers} are available to manipulate the selected words. +The entry is split into words in the same fashion that Bash +does when reading input, +so that several words surrounded by quotes are considered one word. +The @dfn{event designator} selects the event, the optional +@dfn{word designator} selects words from the event, and +various optional @dfn{modifiers} are available to manipulate the +selected words. + History expansions are introduced by the appearance of the history expansion character, which is @samp{!} by default. +History expansions may appear anywhere in the input, but do not nest. History expansion implements shell-like quoting conventions: a backslash can be used to remove the special handling for the next character; @@ -305,22 +375,44 @@ 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. + +Several characters inhibit history expansion if found immediately +following the history expansion character, even if it is unquoted: +space, tab, newline, carriage return, @samp{=}, +and the other shell metacharacters. @end ifset +There is a special abbreviation for substitution, active when the +@var{quick substitution} character +@ifset BashFeatures +(described above under @code{histchars}) +@end ifset +@ifclear BashFeatures +(default @samp{^}) +@end ifclear +is the first character on the line. +It selects the previous history list entry, using an event designator +equivalent to @code{!!}, +and substitutes one string for another in that entry. +It is described below (@pxref{Event Designators}). +This is the only history expansion that does not begin with the history +expansion character. + @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 +builtin (@pxref{The Shopt Builtin}) +modify history expansion behavior +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 +shell option is enabled, a failed history expansion is 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. +shows 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. @@ -328,9 +420,9 @@ 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. +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 @@ -343,8 +435,10 @@ writing the history file. @subsection Event Designators @cindex event designators -An event designator is a reference to a command line entry in the -history list. +An event designator is a reference to an entry in the history list. +The event designator consists of the portion of the word beginning +with the history expansion character, and ending with the word designator +if one is present, or the end of the word. Unless the reference is absolute, events are relative to the current position in the history list. @cindex history events @@ -354,8 +448,9 @@ position in the history list. @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). +the end of the line, @samp{=}, +or the rest of the shell metacharacters defined above +(@pxref{Definitions}). @end ifset @ifclear BashFeatures Start a history substitution, except when followed by a space, tab, @@ -363,13 +458,14 @@ the end of the line, or @samp{=}. @end ifclear @item @code{!@var{n}} -Refer to command line @var{n}. +Refer to history list entry @var{n}. @item @code{!-@var{n}} -Refer to the command @var{n} lines back. +Refer to the history entry minus @var{n}. @item @code{!!} -Refer to the previous command. This is a synonym for @samp{!-1}. +Refer to the previous entry. +This is a synonym for @samp{!-1}. @item @code{!@var{string}} Refer to the most recent command @@ -383,13 +479,14 @@ 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; +If @var{string} is missing, this uses +the string from the most recent search; 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}^}. +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. @@ -400,23 +497,28 @@ The entire command line typed so far. @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. +They are optional; if the word designator isn't supplied, the history +expansion uses the entire 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). +That first word is usually the command word, and the arguments begin +with the second word. +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. +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{!$}. +designates the last word of the preceding command. +This may be shortened to @code{!$}. @item !fi:2 designates the second argument of the most recent command starting with @@ -425,35 +527,42 @@ the letters @code{fi}. @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. +The @code{0}th word. +For the shell, and many other, applications, this is the command word. @item @var{n} The @var{n}th word. @item ^ -The first argument; that is, word 1. +The first argument: word 1. @item $ -The last argument. +The last word. +This is usually the last argument, but expands to the +zeroth word if there is only one word in the line. @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. +By default, searches begin at the end of each line and proceed to the +beginning, so the first word matched is the one closest to the end of +the line. @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-$}. +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. +it expands to the empty string in that case. @item @var{x}* -Abbreviates @samp{@var{x}-$} +Abbreviates @samp{@var{x}-$}. @item @var{x}- Abbreviates @samp{@var{x}-$} like @samp{@var{x}*}, but omits the last word. @@ -462,7 +571,7 @@ 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. +previous command is used as the event, equivalent to @code{!!}. @node Modifiers @subsection Modifiers @@ -474,10 +583,10 @@ 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. +Remove a trailing filename component, leaving only the head. @item t -Remove all leading pathname components, leaving the tail. +Remove all leading filename components, leaving the tail. @item r Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving @@ -496,8 +605,8 @@ 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. +The @samp{q} and @samp{x} modifiers are mutually exclusive; +expansion uses the last one supplied. @end ifset @item s/@var{old}/@var{new}/ @@ -505,9 +614,9 @@ 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{&}. +with a single backslash. +If @samp{&} appears in @var{new}, it is replaced with @var{old}. +A single backslash quotes the @samp{&} in @var{old} and @var{new}. 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} @@ -522,8 +631,9 @@ 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}/}, +Cause changes to be applied over the entire event line. +This is used in conjunction with +@samp{s}, as in @code{gs/@var{old}/@var{new}/}, or with @samp{&}. @item G diff --git a/doc/readline.0 b/doc/readline.0 index b7c45a7..703480e 100644 --- a/doc/readline.0 +++ b/doc/readline.0 @@ -1,76 +1,100 @@ -READLINE(3) Library Functions Manual READLINE(3) +_R_E_A_D_L_I_N_E(3) Library Functions Manual _R_E_A_D_L_I_N_E(3) - - -NAME +NNAAMMEE 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 +SSYYNNOOPPSSIISS + ##iinncclluuddee <> + ##iinncclluuddee <> + ##iinncclluuddee <> + + _c_h_a_r _* + rreeaaddlliinnee (_c_o_n_s_t _c_h_a_r _*_p_r_o_m_p_t); + +CCOOPPYYRRIIGGHHTT + Readline is Copyright (C) 1989-2025 Free Software Foundation, Inc. + +DDEESSCCRRIIPPTTIIOONN + rreeaaddlliinnee reads a line from the terminal and return it, using pprroommpptt as + a prompt. If pprroommpptt is NNUULLLL or the empty string, rreeaaddlliinnee does not is- + sue a prompt. The line returned is allocated with _m_a_l_l_o_c(3); the + caller must free it when finished. The line returned has the final + newline removed, so only the text of the line remains. Since it's pos- + sible to enter characters into the line while quoting them to disable + any rreeaaddlliinnee editing function they might normally have, this line may + include embedded newlines and other special characters. + + rreeaaddlliinnee offers editing capabilities while the user is entering the + line. By default, the line editing commands are similar to those of emacs. A vi-style line editing interface is also available. - 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 + This manual page describes only the most basic use of rreeaaddlliinnee. Much + more functionality is available; see _T_h_e _G_N_U _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y and _T_h_e + _G_N_U _H_i_s_t_o_r_y _L_i_b_r_a_r_y for additional information. + +RREETTUURRNN VVAALLUUEE + rreeaaddlliinnee returns the text of the line read. A blank line returns the + empty string. If EEOOFF is encountered while reading a line, and the line + is empty, rreeaaddlliinnee returns NNUULLLL. If an EEOOFF is read with a non-empty + line, it is treated as a newline. + +NNOOTTAATTIIOONN + This section uses Emacs-style editing concepts and uses its notation + for keystrokes. Control keys are denoted by C-_k_e_y, e.g., C-n means + Control-N. Similarly, _m_e_t_a keys are denoted by M-_k_e_y, so M-x means + Meta-X. The Meta key is often labeled "Alt" or "Option". + + On keyboards without a _M_e_t_a key, M-_x means ESC _x, i.e., press and re- + lease the Escape key, then press and release the _x key, in sequence. + This makes ESC the _m_e_t_a _p_r_e_f_i_x. The combination M-C-_x means ESC Con- + trol-_x: press and release the Escape key, then press and hold the Con- + trol key while pressing the _x key, then release both. + + On some keyboards, the Meta key modifier produces characters with the + eighth bit (0200) set. You can use the eennaabbllee--mmeettaa--kkeeyy variable to + control whether or not it does this, if the keyboard allows it. On + many others, the terminal or terminal emulator converts the metafied + key to a key sequence beginning with ESC as described in the preceding + paragraph. + + If your _M_e_t_a key produces a key sequence with the ESC meta prefix, you + can make M-_k_e_y key bindings you specify (see RReeaaddlliinnee KKeeyy BBiinnddiinnggss be- + low) do the same thing by setting the ffoorrccee--mmeettaa--pprreeffiixx variable. + + RReeaaddlliinnee commands may be given numeric _a_r_g_u_m_e_n_t_s, which normally act as + a repeat count. Sometimes, however, it is the sign of the argument + that is significant. Passing a negative argument to a command that + acts in the forward direction (e.g., kkiillll--lliinnee) makes that command act + in a backward direction. Commands whose behavior with arguments devi- + ates from this are noted below. + + The _p_o_i_n_t is the current cursor position, and _m_a_r_k refers to a saved + cursor position. The text between the point and mark is referred to as + the _r_e_g_i_o_n. + + When a command is described as _k_i_l_l_i_n_g text, the text deleted is saved + for possible future retrieval (_y_a_n_k_i_n_g). The killed text is saved in a + _k_i_l_l _r_i_n_g. Consecutive kills accumulate the deleted text 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. +IINNIITTIIAALLIIZZAATTIIOONN FFIILLEE + RReeaaddlliinnee is customized by putting commands in an initialization file + (the _i_n_p_u_t_r_c file). The name of this file is taken from the value of + the IINNPPUUTTRRCC environment variable. If that variable is unset, the de- + fault is _~_/_._i_n_p_u_t_r_c. If that file does not exist or cannot be read, + rreeaaddlliinnee looks for _/_e_t_c_/_i_n_p_u_t_r_c. When a program that uses the rreeaaddlliinnee + library starts up, rreeaaddlliinnee reads the initialization file and sets the + key bindings and variables found there, before reading any user input. + + There are only a few basic constructs allowed in the inputrc 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. + + The default key-bindings in this document may be changed using key + binding commands in the _i_n_p_u_t_r_c file. Programs that use this library + may add their own commands and bindings. For example, placing @@ -78,105 +102,112 @@ READLINE(3) Library Functions Manual READLINE(3) 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 + into the _i_n_p_u_t_r_c would make M-C-u execute the rreeaaddlliinnee command _u_n_i_v_e_r_- + _s_a_l_-_a_r_g_u_m_e_n_t. + + Key bindings may contain the following symbolic character names: _D_E_L, + _E_S_C, _E_S_C_A_P_E, _L_F_D, _N_E_W_L_I_N_E, _R_E_T, _R_E_T_U_R_N, _R_U_B_O_U_T (a destructive back- + space), _S_P_A_C_E, _S_P_C, and _T_A_B. + + In addition to command names, rreeaaddlliinnee allows keys to be bound to a + string that is inserted when the key is pressed (a _m_a_c_r_o). The differ- + ence between a macro and a command is that a macro is enclosed in sin- + gle or double quotes. + + KKeeyy BBiinnddiinnggss + The syntax for controlling key bindings in the _i_n_p_u_t_r_c file is simple. + All that is required is the name of the command or the text of a macro + and a key sequence to which it should be bound. The key sequence may + be specified in one of two ways: as a symbolic key name, possibly with + _M_e_t_a_- or _C_o_n_t_r_o_l_- prefixes, or as a key sequence composed of one or + more characters enclosed in double quotes. The key sequence and name + are separated by a colon. There can be no whitespace between the name + and the colon. + + When using the form kkeeyynnaammee:_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, _k_e_y_n_a_m_e is the name of a key spelled out in English. For example: Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output" - In the above example, C-u is bound to the function 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 above example, _C_-_u is bound to the function uunniivveerrssaall--aarrgguummeenntt, + _M_-_D_E_L is bound to the function bbaacckkwwaarrdd--kkiillll--wwoorrdd, 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. + In the second form, ""kkeeyysseeqq"":_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, kkeeyysseeqq differs + from kkeeyynnaammee above in that strings denoting an entire key sequence may + be specified by placing the sequence within double quotes. Some GNU + Emacs style key escapes can be used, as in the following example, but + none of the symbolic character names are 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''. + In this example, _C_-_u is again bound to the function uunniivveerrssaall--aarrgguummeenntt. + _C_-_x _C_-_r is bound to the function rree--rreeaadd--iinniitt--ffiillee, and _E_S_C _[ _1 _1 _~ is + bound to insert the text "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 + \\CC-- A control prefix. + \\MM-- Adding the meta prefix or converting the following char- + acter to a meta character, as described below under + ffoorrccee--mmeettaa--pprreeffiixx. + \\ee 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 + \\aa alert (bell) + \\bb backspace + \\dd delete + \\ff form feed + \\nn newline + \\rr carriage return + \\tt horizontal tab + \\vv vertical tab + \\_n_n_n The eight-bit character whose value is the octal value + _n_n_n (one to three digits). + \\xx_H_H The eight-bit character whose value is the hexadecimal + value _H_H (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 func- + tion name. The backslash escapes described above are expanded in the + macro body. Backslash quotes any other character in the macro text, + including " and '. + + BBaasshh will display or modify the current rreeaaddlliinnee key bindings with the + bbiinndd builtin command. The --oo eemmaaccss or --oo vvii options to the sseett builtin + change the editing mode during interactive use. Other programs using + this library provide similar mechanisms. A user may always edit the + _i_n_p_u_t_r_c file and have rreeaaddlliinnee re-read it if a program does not provide + any other means to incorporate new bindings. + + VVaarriiaabblleess + RReeaaddlliinnee has variables that can be used to further customize its behav- + ior. A variable may be set in the _i_n_p_u_t_r_c file with a statement of the form - set variable-name value + sseett _v_a_r_i_a_b_l_e_-_n_a_m_e _v_a_l_u_e - Except where noted, readline variables can take the values On or Off + Except where noted, rreeaaddlliinnee variables can take the values OOnn or OOffff (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 + When rreeaaddlliinnee reads a variable value, empty or null values, "on" (case- + insensitive), and "1" are equivalent to OOnn. All other values are + equivalent to OOffff. + + The variables and their default values are: + + aaccttiivvee--rreeggiioonn--ssttaarrtt--ccoolloorr + A string variable that controls the text color and background + when displaying the text in the active region (see the descrip- + tion of eennaabbllee--aaccttiivvee--rreeggiioonn 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 @@ -184,9 +215,9 @@ READLINE(3) Library Functions Manual READLINE(3) 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- + aaccttiivvee--rreeggiioonn--eenndd--ccoolloorr + A string variable that "undoes" the effects of aaccttiivvee--rree-- + ggiioonn--ssttaarrtt--ccoolloorr 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. @@ -196,753 +227,844 @@ READLINE(3) Library Functions Manual READLINE(3) 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 + bbeellll--ssttyyllee ((aauuddiibbllee)) + Controls what happens when rreeaaddlliinnee wants to ring the terminal + bell. If set to nnoonnee, rreeaaddlliinnee never rings the bell. If set to + vviissiibbllee, rreeaaddlliinnee uses a visible bell if one is available. If + set to aauuddiibbllee, rreeaaddlliinnee attempts to ring the terminal's bell. + bbiinndd--ttttyy--ssppeecciiaall--cchhaarrss ((OOnn)) + If set to OOnn, rreeaaddlliinnee attempts to bind the control characters + that are treated specially by the kernel's terminal driver to + their rreeaaddlliinnee equivalents. These override the default rreeaaddlliinnee + bindings described here. Type "stty -a" at a bbaasshh prompt to see + your current terminal settings, including the special control + characters (usually cccchhaarrss). + bblliinnkk--mmaattcchhiinngg--ppaarreenn ((OOffff)) + If set to OOnn, rreeaaddlliinnee 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 + ccoolloorreedd--ccoommpplleettiioonn--pprreeffiixx ((OOffff)) + If set to OOnn, when listing completions, rreeaaddlliinnee 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 + ent color. The color definitions are taken from the value of + the LLSS__CCOOLLOORRSS environment variable. If there is a color defini- + tion in $$LLSS__CCOOLLOORRSS for the custom suffix "readline-colored-com- + pletion-prefix", rreeaaddlliinnee uses this color for the common prefix instead of its default. - colored-stats (Off) - If set to On, readline displays possible completions using dif- + ccoolloorreedd--ssttaattss ((OOffff)) + If set to OOnn, rreeaaddlliinnee 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 + tions are taken from the value of the LLSS__CCOOLLOORRSS 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) + ccoommmmeenntt--bbeeggiinn (("##")) + The string that the rreeaaddlliinnee iinnsseerrtt--ccoommmmeenntt command inserts. + This command is bound to MM--## in emacs mode and to ## in vi com- + mand mode. + ccoommpplleettiioonn--ddiissppllaayy--wwiiddtthh ((--11)) 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 + causes matches to be displayed one per line. The default value + is -1. + ccoommpplleettiioonn--iiggnnoorree--ccaassee ((OOffff)) + If set to OOnn, rreeaaddlliinnee 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- + ccoommpplleettiioonn--mmaapp--ccaassee ((OOffff)) + If set to OOnn, and ccoommpplleettiioonn--iiggnnoorree--ccaassee is enabled, rreeaaddlliinnee + 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- + ccoommpplleettiioonn--pprreeffiixx--ddiissppllaayy--lleennggtthh ((00)) + The maximum 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, rreeaaddlliinnee replaces common + prefixes longer than this value with an ellipsis when displaying + possible completions. If a completion begins with a period, and + eeaaddlliinnee is completing filenames, it uses three underscores in- + stead of an ellipsis. + ccoommpplleettiioonn--qquueerryy--iitteemmss ((110000)) + This determines when the user is queried about viewing the num- + ber of possible completions generated by the ppoossssiibbllee--ccoommppllee-- + ttiioonnss 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, rreeaaddlliinnee + asks whether or not the user wishes to view them; otherwise + rreeaaddlliinnee simply lists them on the terminal. A zero value means + rreeaaddlliinnee should never ask; negative values are treated as zero. + ccoonnvveerrtt--mmeettaa ((OOnn)) + If set to OOnn, rreeaaddlliinnee converts characters it reads that have + the eighth bit set to an ASCII key sequence by clearing the + eighth bit and prefixing it with an escape character (converting + the character to have the meta prefix). The default is _O_n, but + rreeaaddlliinnee sets it to _O_f_f if the locale contains characters whose + encodings may include bytes with the eighth bit set. This vari- + able is dependent on the LLCC__CCTTYYPPEE locale category, and may + change if the locale changes. This variable also affects key + bindings; see the description of ffoorrccee--mmeettaa--pprreeffiixx below. + ddiissaabbllee--ccoommpplleettiioonn ((OOffff)) + If set to OOnn, rreeaaddlliinnee inhibits word completion. Completion + characters are inserted into the line as if they had been mapped + to sseellff--iinnsseerrtt. + eecchhoo--ccoonnttrrooll--cchhaarraacctteerrss ((OOnn)) + When set to OOnn, on operating systems that indicate they support + it, rreeaaddlliinnee 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 + eeddiittiinngg--mmooddee ((eemmaaccss)) + Controls whether rreeaaddlliinnee uses a set of key bindings similar to + _E_m_a_c_s or _v_i. eeddiittiinngg--mmooddee can be set to either eemmaaccss or vvii. + eemmaaccss--mmooddee--ssttrriinngg ((@@)) + If the _s_h_o_w_-_m_o_d_e_-_i_n_-_p_r_o_m_p_t 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 + key binding, so the standard set of meta- and control- prefixes + and backslash escape sequences is available. The \1 and \2 es- + capes begin and end sequences of non-printing characters, which + can be used to embed a terminal control sequence into the mode + string. + eennaabbllee--aaccttiivvee--rreeggiioonn ((OOnn)) + When this variable is set to _O_n, rreeaaddlliinnee allows certain com- + mands to designate the region as _a_c_t_i_v_e. When the region is ac- + tive, rreeaaddlliinnee highlights the text in the region using the value + of the aaccttiivvee--rreeggiioonn--ssttaarrtt--ccoolloorr variable, which defaults to the + string that enables the terminal's standout mode. The active + region shows the text inserted by bracketed-paste and any match- + ing text found by incremental and non-incremental history + searches. + eennaabbllee--bbrraacckkeetteedd--ppaassttee ((OOnn)) + When set to OOnn, rreeaaddlliinnee 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 + the keyboard. This is called _b_r_a_c_k_e_t_e_d_-_p_a_s_t_e _m_o_d_e; it prevents + rreeaaddlliinnee from executing any editing commands bound to key se- + quences appearing in the pasted text. + eennaabbllee--kkeeyyppaadd ((OOffff)) + When set to OOnn, rreeaaddlliinnee tries to enable the application keypad + when it is called. Some systems need this to enable the arrow + keys. + eennaabbllee--mmeettaa--kkeeyy ((OOnn)) + When set to OOnn, rreeaaddlliinnee tries to enable any meta modifier key + the terminal claims to support. On many terminals, the Meta key + is used to send eight-bit characters; this variable checks for + the terminal capability that indicates the terminal can enable + and disable a mode that sets the eighth bit of a character + (0200) if the Meta key is held down when the character is typed + (a meta character). + eexxppaanndd--ttiillddee ((OOffff)) + If set to OOnn, rreeaaddlliinnee performs tilde expansion when it attempts + word completion. + ffoorrccee--mmeettaa--pprreeffiixx ((OOffff)) + If set to OOnn, rreeaaddlliinnee modifies its behavior when binding key + sequences containing \M- or Meta- (see KKeeyy BBiinnddiinnggss above) by + converting a key sequence of the form \M-_C or Meta-_C to the two- + character sequence EESSCC _C (adding the meta prefix). If + ffoorrccee--mmeettaa--pprreeffiixx is set to OOffff (the default), rreeaaddlliinnee uses the + value of the ccoonnvveerrtt--mmeettaa variable to determine whether to per- + form this conversion: if ccoonnvveerrtt--mmeettaa is OOnn, rreeaaddlliinnee performs + the conversion described above; if it is OOffff, rreeaaddlliinnee converts + _C to a meta character by setting the eighth bit (0200). + hhiissttoorryy--pprreesseerrvvee--ppooiinntt ((OOffff)) + If set to OOnn, the history code attempts to place point at the + same location on each history line retrieved with pprreevviioouuss--hhiiss-- + ttoorryy or nneexxtt--hhiissttoorryy. + hhiissttoorryy--ssiizzee ((uunnsseett)) + 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 + number of history entries is not limited. Setting _h_i_s_t_o_r_y_-_s_i_z_e + to a non-numeric value will set the maximum number of history + entries to 500. + hhoorriizzoonnttaall--ssccrroollll--mmooddee ((OOffff)) + Setting this variable to OOnn makes rreeaaddlliinnee 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. + iinnppuutt--mmeettaa ((OOffff)) + If set to OOnn, rreeaaddlliinnee enables eight-bit input (that is, it does + not clear the eighth bit in the characters it reads), regardless + of what the terminal claims it can support. The default is _O_f_f, + but rreeaaddlliinnee sets it to _O_n if the locale contains characters + whose encodings may include bytes with the eighth bit set. This + variable is dependent on the LLCC__CCTTYYPPEE locale category, and its + value may change if the locale changes. The name mmeettaa--ffllaagg is a + synonym for iinnppuutt--mmeettaa. + iisseeaarrcchh--tteerrmmiinnaattoorrss (("CC--[[CC--jj")) + 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 _E_S_C and CC--jj terminate an incremental search. + kkeeyymmaapp ((eemmaaccss)) + Set the current rreeaaddlliinnee keymap. The set of valid keymap names + is _e_m_a_c_s_, _e_m_a_c_s_-_s_t_a_n_d_a_r_d_, _e_m_a_c_s_-_m_e_t_a_, _e_m_a_c_s_-_c_t_l_x_, _v_i_, _v_i_-_c_o_m_- + _m_a_n_d, and _v_i_-_i_n_s_e_r_t. _v_i is equivalent to _v_i_-_c_o_m_m_a_n_d; _e_m_a_c_s is + equivalent to _e_m_a_c_s_-_s_t_a_n_d_a_r_d. The default value is _e_m_a_c_s; the + value of eeddiittiinngg--mmooddee also affects the default keymap. + kkeeyysseeqq--ttiimmeeoouutt ((550000)) + Specifies the duration rreeaaddlliinnee 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 + input to complete a longer key sequence). If rreeaaddlliinnee does not + receive any input within the timeout, it uses the shorter but + complete key sequence. The value is specified in milliseconds, + so a value of 1000 means that rreeaaddlliinnee 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, rreeaaddlliinnee waits un- + til another key is pressed to decide which key sequence to com- + plete. + mmaarrkk--ddiirreeccttoorriieess ((OOnn)) + If set to OOnn, completed directory names have a slash appended. + mmaarrkk--mmooddiiffiieedd--lliinneess ((OOffff)) + If set to OOnn, rreeaaddlliinnee displays history lines that have been + modified with a preceding asterisk (**). + mmaarrkk--ssyymmlliinnkkeedd--ddiirreeccttoorriieess ((OOffff)) + If set to OOnn, completed names which are symbolic links to direc- + tories have a slash appended, subject to the value of mmaarrkk--ddii-- + rreeccttoorriieess. + mmaattcchh--hhiiddddeenn--ffiilleess ((OOnn)) + This variable, when set to OOnn, forces rreeaaddlliinnee to match files + whose names begin with a "." (hidden files) when performing + filename completion. If set to OOffff, the user must include the + leading "." in the filename to be completed. + mmeennuu--ccoommpplleettee--ddiissppllaayy--pprreeffiixx ((OOffff)) + If set to OOnn, 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) + oouuttppuutt--mmeettaa ((OOffff)) + If set to OOnn, rreeaaddlliinnee displays characters with the eighth bit + set directly rather than as a meta-prefixed escape sequence. + The default is _O_f_f, but rreeaaddlliinnee sets it to _O_n if the locale + contains characters whose encodings may include bytes with the + eighth bit set. This variable is dependent on the LLCC__CCTTYYPPEE lo- + cale category, and its value may change if the locale changes. + ppaaggee--ccoommpplleettiioonnss ((OOnn)) + If set to OOnn, rreeaaddlliinnee uses an internal pager resembling _m_o_r_e(1) + to display a screenful of possible completions at a time. + pprreeffeerr--vviissiibbllee--bbeellll + See bbeellll--ssttyyllee. + pprriinntt--ccoommpplleettiioonnss--hhoorriizzoonnttaallllyy ((OOffff)) + If set to OOnn, rreeaaddlliinnee displays completions with matches sorted + horizontally in alphabetical order, rather than down the screen. + rreevveerrtt--aallll--aatt--nneewwlliinnee ((OOffff)) + If set to OOnn, rreeaaddlliinnee will undo all changes to history lines + before returning when executing aacccceepptt--lliinnee. By default, his- + tory lines may be modified and retain individual undo lists + across calls to rreeaaddlliinnee(()). + sseeaarrcchh--iiggnnoorree--ccaassee ((OOffff)) + If set to OOnn, rreeaaddlliinnee performs incremental and non-incremental + history list searches in a case-insensitive fashion. + sshhooww--aallll--iiff--aammbbiigguuoouuss ((OOffff)) 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 + If set to OOnn, 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 + sshhooww--aallll--iiff--uunnmmooddiiffiieedd ((OOffff)) + This alters the default behavior of the completion functions in + a fashion similar to sshhooww--aallll--iiff--aammbbiigguuoouuss. If set to OOnn, 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- + sshhooww--mmooddee--iinn--pprroommpptt ((OOffff)) + If set to OOnn, 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 + The mode strings are user-settable (e.g., _e_m_a_c_s_-_m_o_d_e_-_s_t_r_i_n_g). + sskkiipp--ccoommpplleetteedd--tteexxtt ((OOffff)) + If set to OOnn, 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 + rreeaaddlliinnee 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 + vvii--ccmmdd--mmooddee--ssttrriinngg ((((ccmmdd)))) + If the _s_h_o_w_-_m_o_d_e_-_i_n_-_p_r_o_m_p_t 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 + 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 + control- prefixes and backslash escape sequences is available. + The \1 and \2 escapes begin and end sequences of non-printing + characters, which can be used to embed a terminal control se- + quence into the mode string. + vvii--iinnss--mmooddee--ssttrriinngg ((((iinnss)))) + If the _s_h_o_w_-_m_o_d_e_-_i_n_-_p_r_o_m_p_t 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- + control- prefixes and backslash escape sequences is available. + The \1 and \2 escapes begin and end sequences of non-printing + characters, which can be used to embed a terminal control se- + quence into the mode string. + vviissiibbllee--ssttaattss ((OOffff)) + If set to OOnn, a character denoting a file's type as reported by + _s_t_a_t(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. + CCoonnddiittiioonnaall CCoonnssttrruuccttss + RReeaaddlliinnee 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 available. - $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, + $$iiff The $$iiff construct allows bindings to be made based on the edit- + ing mode, the terminal being used, or the application using + rreeaaddlliinnee. 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. + mmooddee The mmooddee== form of the $$iiff directive is used to test + whether rreeaaddlliinnee is in emacs or vi mode. This may be + used in conjunction with the sseett kkeeyymmaapp command, for in- + stance, to set bindings in the _e_m_a_c_s_-_s_t_a_n_d_a_r_d and + _e_m_a_c_s_-_c_t_l_x keymaps only if rreeaaddlliinnee is starting out in + emacs mode. - term The term= form may be used to include terminal-specific + tteerrmm The tteerrmm== 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 + of the == is tested against both the full name of the ter- + minal and the portion of the terminal name before the + first --. This allows _x_t_e_r_m to match both _x_t_e_r_m and + _x_t_e_r_m_-_2_5_6_c_o_l_o_r, for instance. + + vveerrssiioonn + The vveerrssiioonn test may be used to perform comparisons + against specific rreeaaddlliinnee versions. The vveerrssiioonn expands + to the current rreeaaddlliinnee 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., 77..11). + If the minor version is omitted, it defaults to 00. The + operator may be separated from the string vveerrssiioonn 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 + _a_p_p_l_i_c_a_t_i_o_n + The _a_p_p_l_i_c_a_t_i_o_n construct is used to include application- + specific settings. Each program using the rreeaaddlliinnee li- + brary sets the _a_p_p_l_i_c_a_t_i_o_n _n_a_m_e, and an initialization file can test for a particular value. This could be used to bind key sequences to functions useful for a specific program. For instance, the following command adds a key sequence that quotes the current or previous word in - bash: + bbaasshh: - $if Bash + $$iiff Bash # Quote the current or previous word "\C-xq": "\eb\"\ef\"" - $endif + $$eennddiiff - variable - The variable construct provides simple equality tests for - readline variables and values. The permitted comparison - operators are =, ==, and !=. The variable name must be + _v_a_r_i_a_b_l_e + The _v_a_r_i_a_b_l_e construct provides simple equality tests for + rreeaaddlliinnee 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. + hand side by whitespace. String and boolean variables + may be tested. Boolean variables must be tested against + the values _o_n and _o_f_f. - $else Commands in this branch of the $if directive are executed if the + $$eellssee Commands in this branch of the $$iiff directive are executed if the test fails. - $include + $$eennddiiff This command, as seen in the previous example, terminates an $$iiff + command. + + $$iinncclluuddee 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: + commands and key bindings from that file. For example, the fol- + lowing directive would read _/_e_t_c_/_i_n_p_u_t_r_c: - $include /etc/inputrc + $$iinncclluuddee _/_e_t_c_/_i_n_p_u_t_r_c -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. +SSEEAARRCCHHIINNGG + RReeaaddlliinnee provides commands for searching through the command history + for lines containing a specified string. There are two search modes: + _i_n_c_r_e_m_e_n_t_a_l and _n_o_n_-_i_n_c_r_e_m_e_n_t_a_l. - Incremental searches begin before the user has finished typing the - search string. As each character of the search string is typed, read- - line displays the next entry from the history matching the string typed + Incremental searches begin before the user has finished typing the + search string. As each character of the search string is typed, rreeaadd-- + lliinnee 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. + needed to find the desired history entry. When using emacs editing + mode, type CC--rr to search backward in the history for a particular + string. Typing CC--ss searches forward through the history. The charac- + ters present in the value of the iisseeaarrcchh--tteerrmmiinnaattoorrss variable are used + to terminate an incremental search. If that variable has not been as- + signed a value, _E_S_C and CC--jj terminate an incremental search. CC--gg + aborts an incremental search and restores 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 CC--rr or CC--ss as + appropriate. This searches backward or forward in the history for the + next entry matching the search string typed so far. Any other key se- + quence bound to a rreeaaddlliinnee command terminates the search and executes + that command. For instance, a newline terminates the search and ac- + cepts 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. + + RReeaaddlliinnee remembers the last incremental search string. If two CC--rrs are + typed without any intervening characters defining a new search string, + rreeaaddlliinnee uses any remembered search string. Non-incremental searches read the entire search string before starting - to search for matching history lines. The search string may be typed + to search for matching history entries. 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 +EEDDIITTIINNGG CCOOMMMMAANNDDSS + 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) + In the following descriptions, _p_o_i_n_t refers to the current cursor posi- + tion, and _m_a_r_k refers to a cursor position saved by the sseett--mmaarrkk com- + mand. The text between the point and mark is referred to as the _r_e_- + _g_i_o_n. RReeaaddlliinnee has the concept of an _a_c_t_i_v_e _r_e_g_i_o_n: when the region is + active, rreeaaddlliinnee redisplay highlights the region using the value of the + aaccttiivvee--rreeggiioonn--ssttaarrtt--ccoolloorr variable. The eennaabbllee--aaccttiivvee--rreeggiioonn variable + turns this on and off. Several commands set the region to active; + those are noted below. + + CCoommmmaannddss ffoorr MMoovviinngg + bbeeggiinnnniinngg--ooff--lliinnee ((CC--aa)) + Move to the start of the current line. This may also be bound + to the Home key on some keyboards. + eenndd--ooff--lliinnee ((CC--ee)) + Move to the end of the line. This may also be bound to the End + key on some keyboards. + ffoorrwwaarrdd--cchhaarr ((CC--ff)) + Move forward a character. This may also be bound to the right + arrow key on some keyboards. + bbaacckkwwaarrdd--cchhaarr ((CC--bb)) Move back a character. - forward-word (M-f) + ffoorrwwaarrdd--wwoorrdd ((MM--ff)) 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 + bbaacckkwwaarrdd--wwoorrdd ((MM--bb)) + 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 + pprreevviioouuss--ssccrreeeenn--lliinnee + 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 rreeaaddlliinnee 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 + nneexxtt--ssccrreeeenn--lliinnee + Attempt to move point to the same physical screen column on the + next physical screen line. This will not have the desired ef- + fect if the current rreeaaddlliinnee line does not take up more than one + physical line or if the length of the current rreeaaddlliinnee line is not greater than the length of the prompt plus the screen width. - clear-display (M-C-l) + cclleeaarr--ddiissppllaayy ((MM--CC--ll)) 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) + cclleeaarr--ssccrreeeenn ((CC--ll)) 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 + rent line at the top of the screen. With a numeric argument, + refresh the current line without clearing the screen. + rreeddrraaww--ccuurrrreenntt--lliinnee Refresh the current line. - Commands for Manipulating the History - accept-line (Newline, Return) + CCoommmmaannddss ffoorr MMaanniippuullaattiinngg tthhee HHiissttoorryy + aacccceepptt--lliinnee ((NNeewwlliinnee,, RReettuurrnn)) 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) + call with aadddd__hhiissttoorryy(()). If the line is a modified history + line, restore the history line to its original state. + pprreevviioouuss--hhiissttoorryy ((CC--pp)) Fetch the previous command from the history list, moving back in - the list. - next-history (C-n) - Fetch the next command from the history list, moving forward in - the list. - beginning-of-history (M-<) + the list. This may also be bound to the up arrow key on some + keyboards. + nneexxtt--hhiissttoorryy ((CC--nn)) + Fetch the next command from the history list, moving forward in + the list. This may also be bound to the down arrow key on some + keyboards. + bbeeggiinnnniinngg--ooff--hhiissttoorryy ((MM--<<)) Move to the first line in the history. - end-of-history (M->) + eenndd--ooff--hhiissttoorryy ((MM-->>)) Move to the end of the input history, i.e., the line currently being entered. - operate-and-get-next (C-o) + ooppeerraattee--aanndd--ggeett--nneexxtt ((CC--oo)) Accept the current line for return to the calling application as - if a newline had been entered, and fetch the next line relative + 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 + ffeettcchh--hhiissttoorryy 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' + rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((CC--rr)) + Search backward starting at the current line and moving "up" + through the history as necessary. This is an incremental + search. This command sets the region to the matched text and + activates the region. + ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((CC--ss)) + Search forward starting at the current line and moving "down" through the history as necessary. This is an incremental - search. - non-incremental-reverse-search-history (M-p) + search. This command sets the region to the matched text and + activates the region. + nnoonn--iinnccrreemmeennttaall--rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((MM--pp)) Search backward through the history starting at the current line using a non-incremental search for a string supplied by the - user. - non-incremental-forward-search-history (M-n) + user. The search string may match anywhere in a history line. + nnoonn--iinnccrreemmeennttaall--ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((MM--nn)) Search forward through the history using a non-incremental - search for a string supplied by the user. - history-search-backward + search for a string supplied by the user. The search string may + match anywhere in a history line. + hhiissttoorryy--sseeaarrcchh--bbaacckkwwaarrdd 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 + non-incremental search. This may be bound to the Page Up key on + some keyboards. + hhiissttoorryy--sseeaarrcchh--ffoorrwwaarrdd + 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. This may be bound to the Page Down key + on some keyboards. + hhiissttoorryy--ssuubbssttrriinngg--sseeaarrcchh--bbaacckkwwaarrdd 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 + 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. + hhiissttoorryy--ssuubbssttrriinngg--sseeaarrcchh--ffoorrwwaarrdd 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- + 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 + yyaannkk--nntthh--aarrgg ((MM--CC--yy)) + 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 + serts the _nth word from the end of the previous command. Once + the argument _n is computed, this uses the history expansion fa- + cilities to extract the _nth word, as if the "!_n" history expan- + sion had been specified. + yyaannkk--llaasstt--aarrgg ((MM--..,, MM--__)) + 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 + exactly like yyaannkk--nntthh--aarrgg. Successive calls to yyaannkk--llaasstt--aarrgg 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 + calls determines the direction to move through the history. A + negative argument switches the direction through the history + (back or forward). This uses the history expansion facilities + to extract the last word, 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) + CCoommmmaannddss ffoorr CChhaannggiinngg TTeexxtt + _e_n_d_-_o_f_-_f_i_l_e ((uussuuaallllyy CC--dd)) + The character indicating end-of-file as set, for example, by + _s_t_t_y(1). If this character is read when there are no characters + on the line, and point is at the beginning of the line, rreeaaddlliinnee + interprets it as the end of input and returns EEOOFF. + ddeelleettee--cchhaarr ((CC--dd)) 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 + same character as the tty EEOOFF character, as CC--dd commonly is, see + above for the effects. This may also be bound to the Delete key + on some keyboards. + bbaacckkwwaarrdd--ddeelleettee--cchhaarr ((RRuubboouutt)) + 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 + ffoorrwwaarrdd--bbaacckkwwaarrdd--ddeelleettee--cchhaarr + Delete the character under the cursor, unless the cursor is at the end of the line, in which case the character behind the 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) + qquuootteedd--iinnsseerrtt ((CC--qq,, CC--vv)) + Add the next character typed to the line verbatim. This is how + to insert characters like CC--qq, for example. + ttaabb--iinnsseerrtt ((MM--TTAABB)) Insert a tab character. - self-insert (a, b, A, 1, !, ...) + sseellff--iinnsseerrtt ((aa,, bb,, AA,, 11,, !!,, ...)) 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. + bbrraacckkeetteedd--ppaassttee--bbeeggiinn + 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 rreeaaddlliinnee to insert the pasted + text as a single unit without treating each character as if it + had been read from the keyboard. The pasted characters are in- + serted as if each one was bound to sseellff--iinnsseerrtt instead of exe- + cuting any editing commands. + Bracketed paste sets the region to the inserted text and acti- + vates the region. + ttrraannssppoossee--cchhaarrss ((CC--tt)) + 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 + ttrraannssppoossee--wwoorrddss ((MM--tt)) + Drag the word before point past the word after point, moving + point past 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- + uuppccaassee--wwoorrdd ((MM--uu)) + 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- + ddoowwnnccaassee--wwoorrdd ((MM--ll)) + Lowercase the current (or following) word. With a negative ar- gument, lowercase the previous word, but do not move point. - capitalize-word (M-c) + ccaappiittaalliizzee--wwoorrdd ((MM--cc)) Capitalize the current (or following) word. With a negative ar- gument, capitalize the previous word, but do not move point. - overwrite-mode + oovveerrwwrriittee--mmooddee 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 + only eemmaaccss mode; vvii mode does overwrite differently. Each call + to _r_e_a_d_l_i_n_e_(_) starts in insert mode. + In overwrite mode, characters bound to sseellff--iinnsseerrtt replace the + text at point rather than pushing the text to the right. Char- + acters bound to bbaacckkwwaarrdd--ddeelleettee--cchhaarr replace the character be- + fore point with a space. By default, this command is unbound, + but may be bound to the Insert key on some keyboards. + + KKiilllliinngg aanndd YYaannkkiinngg + kkiillll--lliinnee ((CC--kk)) + Kill the text from point to the end of the current line. With a + negative numeric argument, kill backward from the cursor to the + beginning of the line. + bbaacckkwwaarrdd--kkiillll--lliinnee ((CC--xx RRuubboouutt)) + Kill backward to the beginning of the current line. With a neg- + ative numeric argument, kill forward from the cursor to the end + of the line. + uunniixx--lliinnee--ddiissccaarrdd ((CC--uu)) + Kill backward from point to the beginning of the line, saving + the killed text on the kill-ring. + kkiillll--wwhhoollee--lliinnee 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 + kkiillll--wwoorrdd ((MM--dd)) + 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 those used by forward-word. - backward-kill-word (M-Rubout) + same as those used by ffoorrwwaarrdd--wwoorrdd. + bbaacckkwwaarrdd--kkiillll--wwoorrdd ((MM--RRuubboouutt)) Kill the word behind point. Word boundaries are the same as - those used by backward-word. - unix-word-rubout (C-w) + those used by bbaacckkwwaarrdd--wwoorrdd. + uunniixx--wwoorrdd--rruubboouutt ((CC--ww)) 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 + ary, saving the killed text on the kill-ring. + uunniixx--ffiilleennaammee--rruubboouutt 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-\) + character as the word boundaries, saving the killed text on the + kill-ring. + ddeelleettee--hhoorriizzoonnttaall--ssppaaccee ((MM--\\)) 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 + kkiillll--rreeggiioonn + Kill the text in the current region. + ccooppyy--rreeggiioonn--aass--kkiillll + Copy the text in the region to the kill buffer, so it can be + yanked immediately. + ccooppyy--bbaacckkwwaarrdd--wwoorrdd Copy the word before point to the kill buffer. The word bound- - aries are the same as backward-word. - copy-forward-word + aries are the same as bbaacckkwwaarrdd--wwoorrdd. + ccooppyy--ffoorrwwaarrdd--wwoorrdd Copy the word following point to the kill buffer. The word - boundaries are the same as forward-word. - yank (C-y) + boundaries are the same as ffoorrwwaarrdd--wwoorrdd. + yyaannkk ((CC--yy)) Yank the top of the kill ring into the buffer at point. - yank-pop (M-y) + yyaannkk--ppoopp ((MM--yy)) Rotate the kill ring, and yank the new top. Only works follow- - ing yank or yank-pop. + ing yyaannkk or yyaannkk--ppoopp. - Numeric Arguments - digit-argument (M-0, M-1, ..., M--) + NNuummeerriicc AArrgguummeennttss + ddiiggiitt--aarrgguummeenntt ((MM--00,, MM--11,, ...,, MM----)) Add this digit to the argument already accumulating, or start a new argument. M-- starts a negative argument. - universal-argument + uunniivveerrssaall--aarrgguummeenntt This is another way to specify an argument. If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument. If the command is fol- - lowed by digits, executing universal-argument again ends the nu- + lowed by digits, executing uunniivveerrssaall--aarrgguummeenntt 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- + ther 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 argu- ment count four, a second time makes the argument count sixteen, and so on. - Completing - complete (TAB) + CCoommpplleettiinngg + ccoommpplleettee ((TTAABB)) 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-?) + tual completion performed is application-specific. BBaasshh, for + instance, attempts programmable completion first, otherwise + treating the text as a variable (if the text begins with $$), + username (if the text begins with ~~), hostname (if the text be- + gins with @@), or command (including aliases, functions, and + builtins) in turn. If none of these produces a match, it falls + back to filename completion. GGddbb, on the other hand, allows + completion of program functions and variables, and only attempts + filename completion under certain circumstances. The default + rreeaaddlliinnee completion is filename completion. + ppoossssiibbllee--ccoommpplleettiioonnss ((MM--??)) 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 + displaying completions, rreeaaddlliinnee sets the number of columns used + for display to the value of ccoommpplleettiioonn--ddiissppllaayy--wwiiddtthh, the value + of the environment variable CCOOLLUUMMNNSS, 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 + iinnsseerrtt--ccoommpplleettiioonnss ((MM--**)) + Insert all completions of the text before point that would have + been generated by ppoossssiibbllee--ccoommpplleettiioonnss, separated by a space. + mmeennuu--ccoommpplleettee + Similar to ccoommpplleettee, but replaces the word to be completed with + a single match from the list of possible completions. Repeat- + edly executing mmeennuu--ccoommpplleettee steps through the list of possible + completions, inserting each match in turn. At the end of the + list of completions, mmeennuu--ccoommpplleettee rings the bell (subject to + the setting of bbeellll--ssttyyllee) and restores the original text. An + argument of _n moves _n positions forward in the list of matches; + a negative argument moves backward through the list. This com- + mand is intended to be bound to TTAABB, but is unbound by default. + mmeennuu--ccoommpplleettee--bbaacckkwwaarrdd + Identical to mmeennuu--ccoommpplleettee, but moves backward through the list + of possible completions, as if mmeennuu--ccoommpplleettee 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 + eexxppoorrtt--ccoommpplleettiioonnss + Perform completion on the word before point as described above + and write the list of possible completions to rreeaaddlliinnee's output + stream using the following format, writing information on sepa- + rate lines: + + +o the number of matches _N; + +o the word being completed; + +o _S:_E, where _S and _E are the start and end offsets of the + word in the rreeaaddlliinnee line buffer; then + +o each match, one per line + + If there are no matches, the first line will be "0", and this + command does not print any output after the _S:_E. If there is + only a single match, this prints a single line containing it. + If there is more than one match, this prints the common prefix + of the matches, which may be empty, on the first line after the + _S:_E, then the matches on subsequent lines. In this case, _N will + include the first line with the common prefix. + + The user or application should be able to accommodate the possi- + bility of a blank line. The intent is that the user or applica- + tion reads _N lines after the line containing _S:_E to obtain the + match list. This command is unbound by default. + + ddeelleettee--cchhaarr--oorr--lliisstt + Deletes the character under the cursor if not at the beginning + or end of the line (like ddeelleettee--cchhaarr). At the end of the line, + it behaves identically to ppoossssiibbllee--ccoommpplleettiioonnss. This command is + unbound by default. + + KKeeyybbooaarrdd MMaaccrrooss + ssttaarrtt--kkbbdd--mmaaccrroo ((CC--xx (()) + Begin saving the characters typed into the current keyboard macro. - end-kbd-macro (C-x )) + eenndd--kkbbdd--mmaaccrroo ((CC--xx )))) Stop saving the characters typed into the current keyboard macro and store the definition. - call-last-kbd-macro (C-x e) + ccaallll--llaasstt--kkbbdd--mmaaccrroo ((CC--xx ee)) 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 () + pprriinntt--llaasstt--kkbbdd--mmaaccrroo (()) Print the last keyboard macro defined in a format suitable for - the inputrc file. + the _i_n_p_u_t_r_c file. - Miscellaneous - re-read-init-file (C-x C-r) - Read in the contents of the inputrc file, and incorporate any + MMiisscceellllaanneeoouuss + rree--rreeaadd--iinniitt--ffiillee ((CC--xx CC--rr)) + Read in the contents of the _i_n_p_u_t_r_c file, and incorporate any bindings or variable assignments found there. - abort (C-g) + aabboorrtt ((CC--gg)) 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 + (subject to the setting of bbeellll--ssttyyllee). + ddoo--lloowweerrccaassee--vveerrssiioonn ((MM--AA,, MM--BB,, MM--_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) + behavior is undefined if _x is already lowercase. + pprreeffiixx--mmeettaa ((EESSCC)) + Metafy the next character typed. EESSCC ff is equivalent to MMeettaa--ff. + uunnddoo ((CC--__,, CC--xx CC--uu)) 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 + rreevveerrtt--lliinnee ((MM--rr)) + Undo all changes made to this line. This is like executing the + uunnddoo command enough times to return the line to its initial state. - tilde-expand (M-&) + ttiillddee--eexxppaanndd ((MM--~~)) 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- + sseett--mmaarrkk ((CC--@@,, MM--<>)) + Set the mark to the point. If a numeric argument is supplied, + set the mark to that position. + eexxcchhaannggee--ppooiinntt--aanndd--mmaarrkk ((CC--xx CC--xx)) + Swap the point with the mark. Set the current cursor position + to the saved position, then set the mark to the old cursor posi- + tion. + cchhaarraacctteerr--sseeaarrcchh ((CC--]])) + Read a character and move point to the next occurrence of that + character. A negative argument searches for previous occur- + rences. + cchhaarraacctteerr--sseeaarrcchh--bbaacckkwwaarrdd ((MM--CC--]])) + Read a character and move point to the previous occurrence of + that character. A negative argument searches for subsequent 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 + sskkiipp--ccssii--sseeqquueennccee + Read enough characters to consume a multi-key sequence such as + those defined for keys like Home and End. CSI sequences begin + with a Control Sequence Indicator (CSI), usually _E_S_C _[. If this + sequence is bound to "\e[", keys producing CSI sequences have no + effect unless explicitly bound to a rreeaaddlliinnee command, instead of + inserting stray characters into the editing buffer. This is un- + bound by default, but usually bound to _E_S_C _[. + iinnsseerrtt--ccoommmmeenntt ((MM--##)) + Without a numeric argument, insert the value of the rreeaaddlliinnee + ccoommmmeenntt--bbeeggiinn variable 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 ccoommmmeenntt--bbeeggiinn, insert the value; otherwise delete the + characters in ccoommmmeenntt--bbeeggiinn from the beginning of the line. In + either case, the line is accepted as if a newline had been + typed. The default value of ccoommmmeenntt--bbeeggiinn 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 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 + dduummpp--ffuunnccttiioonnss + Print all of the functions and their key bindings to the rreeaadd-- + lliinnee 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 + _i_n_p_u_t_r_c file. + dduummpp--vvaarriiaabblleess + Print all of the settable variables and their values to the + rreeaaddlliinnee 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. - 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 + _i_n_p_u_t_r_c file. + dduummpp--mmaaccrrooss + Print all of the rreeaaddlliinnee key sequences bound to macros and the + strings they output to the rreeaaddlliinnee output stream. If a numeric + argument is supplied, the output is formatted in such a way that + it can be made part of an _i_n_p_u_t_r_c file. + eexxeeccuuttee--nnaammeedd--ccoommmmaanndd ((MM--xx)) + Read a bindable rreeaaddlliinnee command name from the input and execute + the function to which it's bound, as if the key sequence to + which it was bound appeared in the input. If this function is + supplied with a numeric argument, it passes that argument to the + function it executes. + eemmaaccss--eeddiittiinngg--mmooddee ((CC--ee)) + When in vvii command mode, this switches rreeaaddlliinnee to eemmaaccss editing mode. + vvii--eeddiittiinngg--mmooddee ((MM--CC--jj)) + When in eemmaaccss editing mode, this switches to vvii editing mode. -DEFAULT KEY BINDINGS +DDEEFFAAUULLTT KKEEYY BBIINNDDIINNGGSS 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 + ferred to as _m_e_t_a_f_i_e_d characters. The printable ASCII characters not mentioned in the list of emacs standard bindings are bound to the - self-insert function, which just inserts the given character into the + sseellff--iinnsseerrtt 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 + tioned are bound to sseellff--iinnsseerrtt. Characters assigned to signal genera- + tion by _s_t_t_y(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 rreeaaddlliinnee to ring the bell (subject to the + setting of the bbeellll--ssttyyllee variable). + + EEmmaaccss MMooddee Emacs Standard bindings "C-@" set-mark @@ -1017,6 +1139,7 @@ READLINE(3) Library Functions Manual READLINE(3) "M-R" revert-line "M-T" transpose-words "M-U" upcase-word + "M-X" execute-named-command "M-Y" yank-pop "M-\" delete-horizontal-space "M-~" tilde-expand @@ -1034,8 +1157,7 @@ READLINE(3) Library Functions Manual READLINE(3) "C-XE" call-last-kbd-macro "C-XC-?" backward-kill-line - - VI Mode bindings + VVII MMooddee bbiinnddiinnggss VI Insert Mode functions "C-D" vi-eof-maybe @@ -1043,15 +1165,17 @@ READLINE(3) Library Functions Manual READLINE(3) "C-I" complete "C-J" accept-line "C-M" accept-line + "C-N" menu-complete + "C-P" menu-complete-backward "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-W" vi-unix-word-rubout "C-Y" yank "C-[" vi-movement-mode - "C-_" undo + "C-_" vi-undo " " to "~" self-insert "C-?" backward-delete-char @@ -1073,7 +1197,7 @@ READLINE(3) Library Functions Manual READLINE(3) "C-T" transpose-chars "C-U" unix-line-discard "C-V" quoted-insert - "C-W" unix-word-rubout + "C-W" vi-unix-word-rubout "C-Y" yank "C-_" vi-undo " " forward-char @@ -1107,7 +1231,7 @@ READLINE(3) Library Functions Manual READLINE(3) "T" vi-char-search "U" revert-line "W" vi-next-word - "X" backward-delete-char + "X" vi-rubout "Y" vi-yank-to "\" vi-complete "^" vi-first-print @@ -1122,7 +1246,7 @@ READLINE(3) Library Functions Manual READLINE(3) "h" backward-char "i" vi-insertion-mode "j" next-history - "k" prev-history + "k" previous-history "l" forward-char "m" vi-set-mark "n" vi-search-again @@ -1137,39 +1261,37 @@ READLINE(3) Library Functions Manual READLINE(3) "|" 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) +SSEEEE AALLSSOO + _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey + _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey + _b_a_s_h(1) -FILES - ~/.inputrc - Individual readline initialization file +FFIILLEESS + _~_/_._i_n_p_u_t_r_c + Individual rreeaaddlliinnee initialization file -AUTHORS +AAUUTTHHOORRSS 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. +BBUUGG RREEPPOORRTTSS + If you find a bug in rreeaaddlliinnee, you should report it. But first, you + should make sure that it really is a bug, and that it appears in the + latest version of the rreeaaddlliinnee library that you have. - 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. + Once you have determined that a bug actually exists, mail a bug report + to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g. If you have a fix, you are welcome to mail + that as well! Suggestions and "philosophical" bug reports may be + mailed to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g or posted to the Usenet newsgroup + ggnnuu..bbaasshh..bbuugg. Comments and bug reports concerning this manual page should be directed - to chet.ramey@case.edu. + to _c_h_e_t_._r_a_m_e_y_@_c_a_s_e_._e_d_u. -BUGS +BBUUGGSS It's too big and too slow. - - -GNU Readline 8.2 2022 September 19 READLINE(3) +GNU Readline 8.3 2024 December 30 _R_E_A_D_L_I_N_E(3) diff --git a/doc/readline.3 b/doc/readline.3 index 77ef02a..f66e21a 100644 --- a/doc/readline.3 +++ b/doc/readline.3 @@ -6,15 +6,41 @@ .\" Case Western Reserve University .\" chet.ramey@case.edu .\" -.\" Last Change: Mon Sep 19 11:11:22 EDT 2022 +.\" Last Change: Mon Dec 30 11:27:47 EST 2024 .\" -.TH READLINE 3 "2022 September 19" "GNU Readline 8.2" +.TH READLINE 3 "2024 December 30" "GNU Readline 8.3" .\" +.ie \n(.g \{\ +.ds ' \(aq +.ds " \(dq +.ds ^ \(ha +.ds ~ \(ti +.\} +.el \{\ +.ds ' ' +.\" \*" is not usable in macro arguments on AT&T troff (DWB, Solaris 10) +.ds " ""\" two adjacent quotes and no space before this comment +.ds ^ ^ +.ds ~ ~ +.\} +. .\" File Name macro. This used to be `.PN', for Path Name, .\" but Sun doesn't seem to like that very much. +.\" \% at the beginning of the string protects the filename from hyphenation. .\" .de FN -\fI\|\\$1\|\fP +\%\fI\|\\$1\|\fP +.. +.\" +.\" Quotation macro: generate consistent quoted strings that don't rely +.\" on the presence of the `CW' constant-width font. +.\" +.de Q +.ie \n(.g \(lq\\$1\(rq\\$2 +.el \{\ +. if t ``\\$1''\\$2 +. if n "\\$1"\\$2 +.\} .. .SH NAME readline \- get a line from a user with editing @@ -34,22 +60,27 @@ readline \- get a line from a user with editing \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. +.if n Readline is Copyright (C) 1989\-2025 Free Software Foundation, Inc. +.if t Readline is Copyright \(co 1989\-2025 Free Software Foundation, Inc. .SH DESCRIPTION .LP .B readline -will read a line from the terminal +reads a line from the terminal and return it, using .B prompt -as a prompt. If +as a prompt. +If .B prompt -is \fBNULL\fP or the empty string, no prompt is issued. +is \fBNULL\fP or the empty string, \fBreadline\fP does not issue a prompt. The line returned is allocated with .IR malloc (3); -the caller must free it when finished. The line returned +the caller must free it when finished. +The line returned has the final newline removed, so only the text of the line remains. +Since it's possible to enter characters into the line while quoting +them to disable any \fBreadline\fP editing function they might normally have, +this line may include embedded newlines and other special characters. .LP .B readline offers editing capabilities while the user is entering the @@ -65,69 +96,108 @@ for additional information. .SH RETURN VALUE .LP .B readline -returns the text of the line read. A blank line -returns the empty string. If +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 readline +returns +.BR NULL . +If an .B EOF -is read with a non\-empty line, it is -treated as a newline. +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, +This section uses Emacs-style editing concepts and uses its +notation for keystrokes. +Control keys are denoted by C\-\fIkey\fP, 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 +keys are denoted by M\-\fIkey\fP, so M\-x means Meta\-X. +The Meta key is often labeled +.Q Alt +or +.Q Option . +.PP +On keyboards without a +.I Meta +key, M\-\fIx\fP means ESC \fIx\fP, i.e., press and release +the Escape key, then press and release 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 +key, in sequence. +This makes ESC the \fImeta prefix\fP. +The combination M\-C\-\fIx\fP means ESC Control\-\fIx\fP: +press and release the Escape key, +then press and hold the Control key while pressing the .I x -key.) +key, then release both. .PP -Readline commands may be given numeric +On some keyboards, the Meta key modifier produces characters with +the eighth bit (0200) set. +You can use the \fBenable\-meta\-key\fP variable +to control whether or not it does this, if the keyboard allows it. +On many others, the terminal or terminal emulator converts the metafied +key to a key sequence beginning with ESC as described in the +preceding paragraph. +.PP +If your \fIMeta\fP key produces a key sequence with the ESC meta prefix, +you can make M-\fIkey\fP key bindings you specify (see +.B "Readline Key Bindings" +below) do the same thing by setting the \fBforce\-meta\-prefix\fP variable. +.PP +.B 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 +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. +makes that command act in a backward direction. Commands whose behavior with arguments deviates from this are noted below. .PP +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. +.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. +(\fIyanking\fP). +The killed text is saved in a \fIkill ring\fP. +Consecutive kills accumulate the deleted text +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 +.B 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 +environment variable. +If that variable is unset, the default is +.IR \*~/.inputrc . +If that file does not exist or cannot be read, \fBreadline\fP looks for .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. +When a program that uses the \fBreadline\fP library starts up, +\fBreadline\fP reads the initialization file +and sets the key bindings and variables found there, +before reading any user input. +.PP +There are only a few basic constructs allowed in the inputrc 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 +The default key-bindings in this document +may be changed using key binding commands in the +.I inputrc +file. +Programs that use this library +may add their own commands and bindings. .PP For example, placing .RS @@ -138,14 +208,13 @@ or .RS C\-Meta\-u: universal\-argument .RE -.sp +.LP into the .I inputrc -would make M\-C\-u execute the readline command +would make M\-C\-u execute the \fBreadline\fP command .IR universal\-argument . .PP -The following symbolic character names are recognized while -processing key bindings: +Key bindings may contain the following symbolic character names: .IR DEL , .IR ESC , .IR ESCAPE , @@ -153,83 +222,92 @@ processing key bindings: .IR NEWLINE , .IR RET , .IR RETURN , -.IR RUBOUT , +.I RUBOUT +(a destructive backspace), .IR SPACE , .IR SPC , and .IR TAB . .PP -In addition to command names, readline allows keys to be bound +In addition to command names, \fBreadline\fP allows keys to be bound to a string that is inserted when the key is pressed (a \fImacro\fP). -.PP +The difference between a macro and a command is that a macro is +enclosed in single or double quotes. .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. +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 key sequence 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 composed of one or more characters +enclosed in double quotes. +The key sequence and name 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, +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 +.PP .RS -Control\-u: universal\-argument -.br -Meta\-Rubout: backward\-kill\-word -.br -Control\-o: "> output" +.EX +.nf +Control-u: universal\-argument +Meta-Rubout: backward\-kill\-word +Control-o: \*"> output\*" +.fi +.EE .RE .LP In the above example, .I C\-u is bound to the function .BR universal\-argument , -.I M-DEL +.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'' +.Q "> output" into the line). .PP -In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP, +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 +within double quotes. +Some GNU Emacs style key escapes can be +used, as in the following example, but none of +the symbolic character names are recognized. +.PP .RS -"\eC\-u": universal\-argument -.br -"\eC\-x\eC\-r": re\-read\-init\-file -.br -"\ee[11~": "Function Key 1" +.EX +.nf +\*"\eC\-u\*": universal\-argument +\*"\eC\-x\eC\-r\*": re\-read\-init\-file +\*"\ee[11\*~\*": \*"Function Key 1\*" +.fi +.EE .RE .PP In this example, -.I C-u +.I C\-u is again bound to the function .BR universal\-argument . -.I "C-x C-r" +.I "C\-x C\-r" is bound to the function .BR re\-read\-init\-file , and -.I "ESC [ 1 1 ~" +.I "ESC [ 1 1 \*~" is bound to insert the text -.if t \f(CWFunction Key 1\fP. -.if n ``Function Key 1''. +.Q "Function Key 1" . .PP The full set of GNU Emacs style escape sequences available when specifying key sequences is @@ -237,22 +315,23 @@ key sequences is .PD 0 .TP .B \eC\- -control prefix +A control prefix. .TP .B \eM\- -meta prefix +Adding the meta prefix or converting the following character to a meta +character, as described below under \fBforce-meta-prefix\fP. .TP .B \ee -an escape character +An escape character. .TP .B \e\e -backslash +Backslash. .TP -.B \e" -literal ", a double quote +.B \e\*" +Literal \*", a double quote. .TP -.B \e' -literal ', a single quote +.B \e\*' +Literal \*', a single quote. .RE .PD .PP @@ -286,39 +365,45 @@ horizontal tab vertical tab .TP .B \e\fInnn\fP -the eight-bit character whose value is the octal value \fInnn\fP -(one to three digits) +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) +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 '. +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. +The backslash escapes described above are expanded +in the macro body. +Backslash quotes 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 +will display or modify the current \fBreadline\fP key bindings with the .B bind -builtin command. The editing mode may be switched during interactive -use by using the -.B \-o -option to the +builtin command. +The +.B \-o emacs +or +.B \-o vi +options to the .B set -builtin command. Other programs using this library provide -similar mechanisms. The +builtin +change the editing mode during interactive use. +Other programs using this library provide similar mechanisms. +A user may always edit the .I inputrc -file may be edited and re-read if a program does not provide +file and have \fBreadline\fP re-read it 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 +.B 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 @@ -326,15 +411,20 @@ file with a statement of the form \fBset\fP \fIvariable\-name\fP \fIvalue\fP .RE .PP -Except where noted, readline variables can take the values +Except where noted, \fBreadline\fP 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 +When \fBreadline\fP reads a variable value, empty or null values, +.Q "on" +(case-insensitive), and +.Q 1 +are equivalent to \fBOn\fP. +All other values are equivalent to \fBOff\fP. +.PP The variables and their default values are: .PP .PD 0 @@ -349,54 +439,69 @@ 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. +A sample value might be +.Q \ee[01;33m . .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. +A string variable that +.Q undoes +the effects of \fBactive\-region\-start\-color\fP +and restores +.Q 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". +A sample value might be +.Q \ee[0m . .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. +Controls what happens when \fBreadline\fP wants to ring the terminal bell. +If set to \fBnone\fP, \fBreadline\fP never rings the bell. +If set to \fBvisible\fP, \fBreadline\fP uses a visible bell if one is available. +If set to \fBaudible\fP, \fBreadline\fP 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. +If set to \fBOn\fP, \fBreadline\fP attempts to bind +the control characters that are treated specially by the kernel's +terminal driver to their \fBreadline\fP equivalents. +These override the default \fBreadline\fP bindings described here. +Type +.Q "stty \-a" +at a \fBbash\fP prompt to see your current terminal settings, +including the special control characters (usually \fBcchars\fP). .TP .B blink\-matching\-paren (Off) -If set to \fBOn\fP, readline attempts to briefly move the cursor to an +If set to \fBOn\fP, \fBreadline\fP 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 +If set to \fBOn\fP, when listing completions, \fBreadline\fP 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 +.Q readline-colored-completion-prefix , +\fBreadline\fP 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 +If set to \fBOn\fP, \fBreadline\fP 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. +.\" Tucking multiple macro calls into a paragraph tag requires some +.\" finesse. We require `\c`, and while the single-font macros don't +.\" honor input trap continuation, the font alternation macros do. .TP -.B comment\-begin (``#'') -The string that is inserted in \fBvi\fP mode when the +.BR comment\-begin\ ( \c +.Q \fB#\fP \fB)\fP +The string that the \fBreadline\fP .B insert\-comment -command is executed. +command inserts. This command is bound to .B M\-# in emacs mode and to @@ -408,23 +513,29 @@ 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. +A value of 0 causes matches to be displayed one per line. The default value is \-1. -.TP +.TP .B completion\-ignore\-case (Off) -If set to \fBOn\fP, readline performs filename matching and completion +If set to \fBOn\fP, \fBreadline\fP 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 +If set to \fBOn\fP, and \fBcompletion\-ignore\-case\fP is enabled, +\fBreadline\fP 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. +The maximum +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, \fBreadline\fP +replaces common prefixes longer than this value +with an ellipsis when displaying possible completions. +If a completion begins with a period, +and \fBeadline\fP is completing filenames, +it uses three underscores instead of an ellipsis. .TP .B completion\-query\-items (100) This determines when the user is queried about viewing @@ -433,33 +544,36 @@ 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. +\fBreadline\fP asks whether or not the user wishes to view them; +otherwise \fBreadline\fP simply lists them on the terminal. +A zero value means \fBreadline\fP should never ask; negative values are +treated as zero. .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. +If set to \fBOn\fP, \fBreadline\fP converts characters it reads +that have the eighth bit set to an ASCII key sequence by +clearing the eighth bit and prefixing it with an escape character +(converting the character to have the meta prefix). +The default is \fIOn\fP, but \fBreadline\fP sets it to \fIOff\fP +if the locale contains +characters whose encodings may include bytes with the eighth bit set. +This variable is dependent on the \fBLC_CTYPE\fP locale category, and +may change if the locale changes. +This variable also affects key bindings; see the description of +\fBforce\-meta\-prefix\fP below. .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. +If set to \fBOn\fP, \fBreadline\fP inhibits word completion. +Completion characters are 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 +\fBreadline\fP 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 +Controls whether \fBreadline\fP uses a set of key bindings similar to \fIEmacs\fP or \fIvi\fP. .B editing\-mode can be set to either @@ -468,52 +582,73 @@ 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 +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 +The \e1 and \e2 escapes 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 +When this variable is set to \fIOn\fP, \fBreadline\fP 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 +When the region is active, \fBreadline\fP +highlights the text in the region using the value of the +.B active\-region\-start\-color +variable, 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 +When set to \fBOn\fP, \fBreadline\fP 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 +This is called \fIbracketed\-paste mode\fP; +it prevents \fBreadline\fP 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. +When set to \fBOn\fP, \fBreadline\fP tries 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. +When set to \fBOn\fP, \fBreadline\fP tries to enable any meta modifier +key the terminal claims to support. +On many terminals, the Meta key is used to send eight-bit characters; +this variable checks for the terminal capability that indicates the +terminal can enable and disable a mode that sets the eighth bit of a +character (0200) if the Meta key is held down when the character is +typed (a meta character). .TP .B expand\-tilde (Off) -If set to \fBOn\fP, tilde expansion is performed when readline +If set to \fBOn\fP, \fBreadline\fP performs tilde expansion when it attempts word completion. .TP +.B force\-meta\-prefix (Off) +If set to \fBOn\fP, \fBreadline\fP modifies its behavior when binding key +sequences containing \eM- or Meta- +(see \fBKey Bindings\fP above) by converting a key sequence of the form +\eM\-\fIC\fP or Meta\-\fIC\fP to the two-character sequence +\fBESC\fP \fIC\fP (adding the meta prefix). +If +.B force\-meta\-prefix +is set to \fBOff\fP (the default), +\fBreadline\fP uses the value of the +.B convert\-meta +variable to determine whether to perform this conversion: +if \fBconvert\-meta\fP is \fBOn\fP, +\fBreadline\fP performs the conversion described above; +if it is \fBOff\fP, \fBreadline\fP converts \fIC\fP to a meta character by +setting the eighth bit (0200). +.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 +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) @@ -523,76 +658,80 @@ 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. +Setting \fIhistory\-size\fP to a non-numeric value will set +the maximum number of history entries 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. +Setting this variable to \fBOn\fP makes \fBreadline\fP 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'') +If set to \fBOn\fP, \fBreadline\fP enables eight-bit input (that is, it +does not clear the eighth bit in the characters it reads), +regardless of what the terminal claims it can support. +The default is \fIOff\fP, but \fBreadline\fP sets it to \fIOn\fP +if the locale contains characters whose encodings may include bytes +with the eighth bit set. +This variable is dependent on the \fBLC_CTYPE\fP locale category, and +its value may change if the locale changes. +The name \fBmeta\-flag\fP is a synonym for \fBinput\-meta\fP. +.TP +.BR isearch\-terminators\ ( \c +.Q \fBC\-[C\-j\fP \fB)\fP 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. +\fIESC\fP and \fBC\-j\fP 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 +Set the current \fBreadline\fP keymap. +The set of valid keymap names is +\fIemacs, emacs\-standard, emacs\-meta, emacs\-ctlx, vi, +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 \fIemacs\fP; +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. +Specifies the duration \fBreadline\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 \fBreadline\fP does not receive any input within the timeout, +it uses 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. +\fBreadline\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 +non-numeric value, \fBreadline\fP waits 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. +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 +If set to \fBOn\fP, \fBreadline\fP displays history lines +that have been modified 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). +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. +This variable, when set to \fBOn\fP, forces \fBreadline\fP to match files whose +names begin with a +.Q . +(hidden files) when performing filename completion. +If set to \fBOff\fP, the user must include the leading +.Q . +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 @@ -600,31 +739,41 @@ 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 +If set to \fBOn\fP, \fBreadline\fP displays 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. +The default is \fIOff\fP, but \fBreadline\fP sets it to \fIOn\fP +if the locale contains characters whose encodings may include +bytes with the eighth bit set. This variable is dependent on the \fBLC_CTYPE\fP locale category, and -may change if the locale is changed. +its value may change if the locale changes. .TP .B page\-completions (On) -If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager +If set to \fBOn\fP, \fBreadline\fP uses an internal pager resembling +.IR more (1) to display a screenful of possible completions at a time. .TP +.B prefer\-visible\-bell +See \fBbell\-style\fP. +.TP .B print\-completions\-horizontally (Off) -If set to \fBOn\fP, readline will display completions with matches +If set to \fBOn\fP, \fBreadline\fP displays 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, +If set to \fBOn\fP, \fBreadline\fP will undo all changes to history lines +before returning when executing \fBaccept\-line\fP. +By default, history lines may be modified and retain individual undo lists across -calls to \fBreadline\fP. +calls to \fBreadline()\fP. +.TP +.B search\-ignore\-case (Off) +If set to \fBOn\fP, \fBreadline\fP performs incremental and non-incremental +history list searches in a case\-insensitive fashion. .TP .B show\-all\-if\-ambiguous (Off) -This alters the default behavior of the completion functions. If -set to +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. @@ -633,9 +782,9 @@ matches to be listed immediately instead of ringing the bell. This alters the default behavior of the completion functions in a fashion similar to \fBshow\-all\-if\-ambiguous\fP. If set to -.BR On , +.BR On , words which have more than one possible completion without any -possible partial completion (the possible completions don't share +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 @@ -646,77 +795,84 @@ 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. +inserting a single match into the line. +It's only active when performing completion in the middle of a word. +If enabled, \fBreadline\fP 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, +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 +The value is expanded like a key binding, so the standard set of +meta- and control- prefixes and backslash escape sequences is available. +The \e1 and \e2 escapes 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, +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 +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. +The \e1 and \e2 escapes 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 +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 +.B 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 +of tests. +There are four parser directives available. +.TP +.B $if 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, +\fBreadline\fP. +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 +.TP +.B mode The \fBmode=\fP form of the \fB$if\fP directive is used to test -whether readline is in emacs or vi mode. +whether \fBreadline\fP 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 \fIemacs\-standard\fP and \fIemacs\-ctlx\fP keymaps only if +\fBreadline\fP is starting out in emacs mode. +.TP +.B term 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 +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 +is tested against both the full name of the terminal and the portion +of the terminal name before the first \fB\-\fP. +This allows +.I xterm to match both -.I sun +.I xterm and -.IR sun\-cmd , +.IR xterm\-256color , for instance. -.IP \fBversion\fP +.TP +.B version The \fBversion\fP test may be used to perform comparisons against -specific readline versions. -The \fBversion\fP expands to the current readline version. +specific \fBreadline\fP versions. +The \fBversion\fP expands to the current \fBreadline\fP version. The set of comparison operators includes .BR = , (and @@ -729,55 +885,67 @@ 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. +minor version (e.g., \fB7.1\fP). +If the minor version is omitted, it +defaults to \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 +.TP +.I application +The \fIapplication\fP construct is used to include +application-specific settings. +Each program using the \fBreadline\fP 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 +a specific program. +For instance, the following command adds a key sequence that quotes the current or previous word in \fBbash\fP: -.sp 1 +.PP .RS +.EX .nf \fB$if\fP Bash # Quote the current or previous word -"\eC-xq": "\eeb\e"\eef\e"" +\*"\eC-xq\*": \*"\eeb\e\*"\eef\e\*"\*" \fB$endif\fP .fi +.EE .RE -.IP \fIvariable\fP -The \fIvariable\fP construct provides simple equality tests for readline +.TP +.I variable +The \fIvariable\fP construct provides simple equality tests for \fBreadline\fP 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 +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 +.TP +.B $else Commands in this branch of the \fB$if\fP directive are executed if the test fails. -.IP \fB$include\fP +.TP +.B $endif +This command, as seen in the previous example, terminates an +\fB$if\fP command. +.TP +.B $include 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 +and key bindings from that file. +For example, the following directive would read \fI/etc/inputrc\fP: +.PP .RS .nf \fB$include\fP \^ \fI/etc/inputrc\fP -.fi +.fi .RE .SH SEARCHING -Readline provides commands for searching through the command history +.B Readline +provides commands for searching through the command history for lines containing a specified string. There are two search modes: .I incremental @@ -786,34 +954,40 @@ and .PP Incremental searches begin before the user has finished typing the search string. -As each character of the search string is typed, readline displays +As each character of the search string is typed, \fBreadline\fP 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. +When using emacs editing mode, type \fBC\-r\fP to +search backward in the history for a particular string. +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. +If that variable has not been assigned a value, +\fIESC\fP and \fBC\-j\fP terminate an incremental search. +\fBC\-g\fP aborts an incremental search and restores 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 +To find other matching entries in the history list, type \fBC\-r\fP or +\fBC\-s\fP as appropriate. +This searches backward or forward in the history for the next +entry matching the search string typed so far. +Any other key sequence bound to a \fBreadline\fP command terminates +the search and executes that command. +For instance, a newline terminates the search and accepts 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 +.B Readline +remembers the last incremental search string. +If two \fBC\-r\fPs are typed without any intervening characters defining +a new search string, \fBreadline\fP uses any remembered search string. +.PP Non-incremental searches read the entire search string before starting -to search for matching history lines. The search string may be +to search for matching history entries. +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 @@ -824,40 +998,54 @@ 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. +.B Readline +has the concept of an \fIactive region\fP: +when the region is active, \fBreadline\fP redisplay +highlights the region using the value of the +.B active\-region\-start\-color +variable. +The \fBenable\-active\-region\fP variable turns this on and off. +Several commands set the region to active; those are noted below. .SS Commands for Moving .PD 0 .TP .B beginning\-of\-line (C\-a) Move to the start of the current line. +This may also be bound to the Home key on some keyboards. .TP .B end\-of\-line (C\-e) Move to the end of the line. +This may also be bound to the End key on some keyboards. .TP .B forward\-char (C\-f) Move forward a character. +This may also be bound to the right arrow key on some keyboards. .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). +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). +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. +physical screen line. +This will not have the desired effect if the current +\fBreadline\fP 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 +physical screen line. +This will not have the desired effect if the current +\fBreadline\fP line does not take up more than one physical line or if +the length of the current \fBreadline\fP line is +not greater than the length of the prompt plus the screen width. .TP .B clear\-display (M\-C\-l) @@ -869,7 +1057,7 @@ leaving the current line at the top of the screen. 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 +With a numeric argument, refresh the current line without clearing the screen. .TP .B redraw\-current\-line @@ -880,18 +1068,21 @@ Refresh the current line. .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 +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. +If the line is a modified history line, +restore the history line to its original state. .TP .B previous\-history (C\-p) Fetch the previous command from the history list, moving back in the list. +This may also be bound to the up arrow key on some keyboards. .TP .B next\-history (C\-n) Fetch the next command from the history list, moving forward in the list. +This may also be bound to the down arrow key on some keyboards. .TP .B beginning\-of\-history (M\-<) Move to the first line in the history. @@ -900,8 +1091,7 @@ Move to the first line in the history. Move to the end of the input history, i.e., the line currently being entered. .TP -.B -operate\-and\-get\-next (C\-o) +.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 @@ -916,38 +1106,46 @@ 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. +Search backward starting at the current line and moving +.Q up +through the history as necessary. +This is an incremental search. +This command sets the region to the matched text and activates the region. .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. +Search forward starting at the current line and moving +.Q down +through the history as necessary. +This is an incremental search. +This command sets the region to the matched text and activates the region. .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. +The search string may match anywhere in a history line. .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. +The search string may match anywhere in a history line. .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). +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. +This may be bound to the Page Up key on some keyboards. .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. +This may be bound to the Page Down key on some keyboards. .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). +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 @@ -963,10 +1161,14 @@ 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. +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, +this uses the history expansion facilities to extract the +\fIn\fPth word, as if the +.Q !\fIn\fP +history expansion had been specified. .TP .B yank\-last\-arg (M\-.\^, M\-_\^) @@ -977,20 +1179,22 @@ 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. +the direction to move through the history. +A negative argument switches the direction through the history +(back or forward). +This uses the history expansion facilities to extract the +last word, as if the +.Q !$ +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''. +.IR stty (1). If this character is read when there are no characters -on the line, and point is at the beginning of the line, readline +on the line, and point is at the beginning of the line, \fBreadline\fP interprets it as the end of input and returns .SM .BR EOF . @@ -1000,26 +1204,41 @@ 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. +This may also be bound to the Delete key on some keyboards. .TP .B backward\-delete\-char (Rubout) -Delete the character behind the cursor. When given a numeric argument, +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 +.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. +Add the next character typed 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,\ !,\ ...) +.B "self\-insert (a, b, A, 1, !, \fR.\|.\|.\fP)" Insert the character typed. .TP +.B bracketed\-paste\-begin +This function is intended to be bound to the +.Q "bracketed paste" +escape +sequence sent by some terminals, and such a binding is assigned by default. +It allows \fBreadline\fP to insert the pasted text as a single unit +without treating each character as if it had been read from the keyboard. +The pasted characters +are inserted as if each one was bound to \fBself\-insert\fP instead of +executing any editing commands. +.IP +Bracketed paste sets the region to the inserted text and activates the region. +.TP .B transpose\-chars (C\-t) Drag the character before point forward over the character at point, moving point forward as well. @@ -1029,77 +1248,88 @@ 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. +moving point past 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 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 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 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. +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. +.IP 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. +before point with a space. +By default, this command is unbound, +but may be bound to the Insert key on some keyboards. .PD .SS Killing and Yanking .PD 0 .TP .B kill\-line (C\-k) -Kill the text from point to the end of the line. +Kill the text from point to the end of the current line. +With a negative numeric argument, kill backward from the cursor to the +beginning of the line. .TP .B backward\-kill\-line (C\-x Rubout) -Kill backward to the beginning of the line. +Kill backward to the beginning of the current line. +With a negative numeric argument, kill forward from the cursor to the +end 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. +Kill backward from point to the beginning of the line, +saving the killed text 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. +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 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. +Kill the word behind point, using white space as a word boundary, +saving the killed text 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. +as the word boundaries, +saving the killed text 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. +Kill the text in the current region. .TP .B copy\-region\-as\-kill -Copy the text in the region to the kill buffer. +Copy the text in the region to the kill buffer, +so it can be yanked immediately. .TP .B copy\-backward\-word Copy the word before point to the kill buffer. @@ -1113,7 +1343,8 @@ The word boundaries are the same as \fBforward\-word\fP. 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 +Rotate the kill ring, and yank the new top. +Only works following .B yank or .BR yank\-pop . @@ -1121,9 +1352,10 @@ or .SS Numeric Arguments .PD 0 .TP -.B digit\-argument (M\-0, M\-1, ..., M\-\-) +.B digit\-argument (M\-0, M\-1, \fR.\|.\|.\fP, M\-\-) Add this digit to the argument already accumulating, or start a new -argument. M\-\- starts a negative argument. +argument. +M\-\- starts a negative argument. .TP .B universal\-argument This is another way to specify an argument. @@ -1133,8 +1365,8 @@ 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. +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. @@ -1146,56 +1378,95 @@ argument count sixteen, and so on. 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. +for instance, attempts programmable completion first, +otherwise 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, functions, and builtins) in turn. +If none of these produces a match, it falls back to filename completion. .BR Gdb , on the other hand, allows completion of program functions and variables, and only attempts filename completion under certain circumstances. +The default \fBreadline\fP completion is filename completion. .TP .B possible\-completions (M\-?) List the possible completions of the text before point. -When displaying completions, readline sets the number of columns used +When displaying completions, \fBreadline\fP 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. +\fBpossible\-completions\fP, +separated by a space. .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 +Repeatedly executing \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 +At the end of the list of completions, +\fBmenu\-complete\fP rings the bell (subject to the setting of \fBbell\-style\fP) -and the original text is restored. +and restores the original text. 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. +of matches; a negative argument moves 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. +negative argument. +This command is unbound by default. +.TP +.B export\-completions +Perform completion on the word before point as described above +and write the list of possible completions to \fBreadline\fP's output +stream using the following format, writing information on separate lines: +.RS +.PD +.IP \(bu +.PD 0 +the number of matches \fIN\fP; +.IP \(bu +the word being completed; +.IP \(bu +\fIS\fP:\fIE\fP, +where \fIS\fP and \fIE\fP are the start and end offsets of the word +in the \fBreadline\fP line buffer; then +.IP \(bu +each match, one per line +.RE +.PD +.IP +If there are no matches, the first line will be +.Q 0 , +and this command does not print any output after the \fIS\fP:\fIE\fP. +If there is only a single match, this prints a single line containing it. +If there is more than one match, this prints the common prefix of the +matches, which may be empty, on the first line after the \fIS\fP:\fIE\fP, +then the matches on subsequent lines. +In this case, \fIN\fP will include the first line with the common prefix. +.IP +The user or application +should be able to accommodate the possibility of a blank line. +The intent is that the user or application reads \fIN\fP lines after +the line containing \fIS\fP:\fIE\fP to obtain the match list. +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. +end of the line (like \fBdelete\-char\fP). +At the end of the line, it behaves identically to \fBpossible\-completions\fP. +This command is unbound by default. .PD -.SS Keyboard Macros +.SS "Keyboard Macros" .PD 0 .TP .B start\-kbd\-macro (C\-x (\^) @@ -1225,7 +1496,7 @@ 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, ...) +.B do\-lowercase\-version (M\-A, M\-B, M\-\fIx\fP, \fR.\|.\|.\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. @@ -1242,83 +1513,99 @@ is equivalent to 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 +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\-&) +.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. +Set the mark to the point. +If a numeric argument is supplied, set the mark 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. +Swap the point with the mark. +Set the current cursor position to the saved position, +then set the mark to the old cursor position. .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. +Read a character and move point 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. +Read a character and move point 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\-[. +defined for keys like Home and End. +CSI sequences begin with a Control Sequence Indicator (CSI), usually +.IR "ESC [" . +If this sequence is bound to +.Q \ee[ , +keys producing CSI sequences have no effect +unless explicitly bound to a \fBreadline\fP command, +instead of inserting stray characters into the editing buffer. +This is unbound by default, but usually bound to +.IR "ESC [" . .TP .B insert\-comment (M\-#) -Without a numeric argument, the value of the readline +Without a numeric argument, insert the value of the \fBreadline\fP .B comment\-begin -variable is inserted at the beginning of the current line. +variable 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. +the characters at the beginning of the line do not match the value +of \fBcomment\-begin\fP, insert the value; otherwise delete +the characters in \fBcomment-begin\fP 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. +\fBcomment\-begin\fP 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. .TP .B dump\-functions -Print all of the functions and their key bindings to the -readline output stream. If a numeric argument is supplied, +Print all of the functions and their key bindings +to the \fBreadline\fP 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, +Print all of the settable variables and their values +to the \fBreadline\fP 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, +Print all of the \fBreadline\fP key sequences bound to macros and the +strings they output +to the \fBreadline\fP 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 execute\-named\-command (M-x) +Read a bindable \fBreadline\fP command name from the input and execute the +function to which it's bound, as if the key sequence to which it was +bound appeared in the input. +If this function is supplied with a numeric argument, it passes that +argument to the function it executes. +.TP .B emacs\-editing\-mode (C\-e) When in .B vi -command mode, this causes a switch to +command mode, this switches \fBreadline\fP to .B emacs editing mode. .TP .B vi\-editing\-mode (M\-C\-j) When in .B emacs -editing mode, this causes a switch to +editing mode, this switches to .B vi editing mode. .PD @@ -1342,7 +1629,7 @@ 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 +The remaining characters are unbound, which causes \fBreadline\fP to ring the bell (subject to the setting of the .B bell\-style variable). @@ -1352,7 +1639,7 @@ variable). .ta 2.5i .sp Emacs Standard bindings -.sp +.PP "C-@" set-mark "C-A" beginning-of-line "C-B" backward-char @@ -1380,11 +1667,11 @@ Emacs Standard bindings "C-_" undo "\^ " to "/" self-insert "0" to "9" self-insert -":" to "~" self-insert +":" to "\*~" self-insert "C-?" backward-delete-char .PP Emacs Meta bindings -.sp +.PP "M-C-G" abort "M-C-H" backward-kill-word "M-C-I" tab-insert @@ -1425,14 +1712,15 @@ Emacs Meta bindings "M-R" revert-line "M-T" transpose-words "M-U" upcase-word +"M-X" execute-named-command "M-Y" yank-pop "M-\e" delete-horizontal-space -"M-~" tilde-expand +"M-\*~" tilde-expand "M-C-?" backward-kill-word "M-_" yank-last-arg .PP Emacs Control-X bindings -.sp +.PP "C-XC-G" abort "C-XC-R" re-read-init-file "C-XC-U" undo @@ -1441,35 +1729,35 @@ Emacs Control-X bindings "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 +.PP "C-D" vi-eof-maybe "C-H" backward-delete-char "C-I" complete "C-J" accept-line "C-M" accept-line +"C-N" menu-complete +"C-P" menu-complete-backward "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-W" vi-unix-word-rubout "C-Y" yank "C-[" vi-movement-mode -"C-_" undo -"\^ " to "~" self-insert +"C-_" vi-undo +"\^ " to "\*~" self-insert "C-?" backward-delete-char .PP VI Command Mode functions -.sp +.PP "C-D" vi-eof-maybe "C-E" emacs-editing-mode "C-G" abort @@ -1486,7 +1774,7 @@ VI Command Mode functions "C-T" transpose-chars "C-U" unix-line-discard "C-V" quoted-insert -"C-W" unix-word-rubout +"C-W" vi-unix-word-rubout "C-Y" yank "C-_" vi-undo "\^ " forward-char @@ -1520,10 +1808,10 @@ VI Command Mode functions "T" vi-char-search "U" revert-line "W" vi-next-word -"X" backward-delete-char +"X" vi-rubout "Y" vi-yank-to "\e" vi-complete -"^" vi-first-print +"\*^" vi-first-print "_" vi-yank-arg "`" vi-goto-mark "a" vi-append-mode @@ -1535,7 +1823,7 @@ VI Command Mode functions "h" backward-char "i" vi-insertion-mode "j" next-history -"k" prev-history +"k" previous-history "l" forward-char "m" vi-set-mark "n" vi-search-again @@ -1548,7 +1836,7 @@ VI Command Mode functions "x" vi-delete "y" vi-yank-to "|" vi-column -"~" vi-change-case +"\*~" vi-change-case .RE .SH "SEE ALSO" .PD 0 @@ -1562,7 +1850,7 @@ VI Command Mode functions .SH FILES .PD 0 .TP -.FN ~/.inputrc +.FN \*~/.inputrc Individual \fBreadline\fP initialization file .PD .SH AUTHORS @@ -1575,7 +1863,7 @@ Chet Ramey, Case Western Reserve University chet.ramey@case.edu .SH BUG REPORTS If you find a bug in -.B readline, +.BR 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 @@ -1585,7 +1873,9 @@ library that you have. 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 +as well! Suggestions and +.Q philosophical +bug reports may be mailed to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet newsgroup .BR gnu.bash.bug . diff --git a/doc/readline.dvi b/doc/readline.dvi index 7296d40..27f73a4 100644 Binary files a/doc/readline.dvi and b/doc/readline.dvi differ diff --git a/doc/readline.html b/doc/readline.html index 1002f4f..897bc7c 100644 --- a/doc/readline.html +++ b/doc/readline.html @@ -1,14 +1,14 @@ - + - + @@ -54,7 +55,6 @@ ul.no-bullet {list-style: none} -

          GNU Readline Library

          @@ -64,34 +64,34 @@ ul.no-bullet {list-style: none} -
          -
          +
          + -

          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/. +The Readline home page is http://www.gnu.org/software/readline/.

          -
          +
          -
          -
          +
          + -

          1 Command Line Editing

          +

          1 Command Line Editing

          -

          This chapter describes the basic features of the GNU +

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

          -
            +
            -
            -
            +
            + -

            1.1 Introduction to Line Editing

            +

            1.1 Introduction to Line Editing

            -

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

            The following paragraphs use Emacs style to +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 +

            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 +

            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 (a meta character), then both are released. +The Meta key is labeled ALT or Option 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 +One of the ALT keys may also 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. +

            On some keyboards, the Meta key modifier produces characters with +the eighth bit (0200) set. +You can use the enable-meta-key variable +to control whether or not it does this, if the keyboard allows it. +On many others, the terminal or terminal emulator converts the metafied +key to a key sequence beginning with ESC as described in the +next paragraph.

            -

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

            If you do not have a Meta or ALT key, or another key working as +a Meta key, you can generally achieve the latter effect by typing ESC +first, and then typing k. +The ESC character is known as the meta prefix).

            -

            In addition, several keys have their own names. Specifically, -DEL, ESC, LFD, SPC, RET, and TAB all +

            Either process is known as metafying the k key. +

            +

            If your Meta key produces a key sequence with the ESC meta prefix, +you can make M-key key bindings you specify +(see Key Bindings in Readline Init File Syntax) +do the same thing by setting the force-meta-prefix variable. +

            +

            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 +(see Readline Init File). +If your keyboard lacks a LFD key, typing C-j will +output the appropriate character. +The RET key may be labeled Return or Enter on some keyboards.


            -
            -
            +
            + -

            1.2 Readline Interaction

            - +

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

              - - - +

              1.2.1 Readline Bare Essentials

              + + + -

              In order to enter characters into the line, simply type them. The typed +

              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 +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. +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, +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. +blank space created by the removal of the text. +These are the bare +essentials for editing the text of an input line:

              -
              -
              C-b
              +
              +
              C-b

              Move back one character.

              -
              C-f
              +
              C-f

              Move forward one character.

              -
              DEL or Backspace
              +
              DEL or Backspace

              Delete the character to the left of the cursor.

              -
              C-d
              +
              C-d

              Delete the character underneath the cursor.

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

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

              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

              - +

              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. +in order to do editing of the input line. +For your convenience, many other commands are available in +addition to C-b, C-f, C-d, and DEL. +Here are some commands for moving more rapidly within the line.

              -
              -
              C-a
              +
              +
              C-a

              Move to the start of the line.

              -
              C-e
              +
              C-e

              Move to the end of the line.

              -
              M-f
              +
              M-f

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

              -
              M-b
              +
              M-b

              Move backward a word.

              -
              C-l
              +
              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 +

              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

              +

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

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

              @@ -364,90 +386,97 @@ it back into the line. 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. +

              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 +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
              +
              +
              C-k

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

              -
              M-d
              +
              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. +Word boundaries are the same as those used by M-f.

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

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

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

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

              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

              +

              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 +

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

              +

              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. +There are two search modes: incremental and non-incremental.

              Incremental searches begin before the user has finished typing the search string. @@ -455,538 +484,596 @@ 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 +When using emacs editing mode, type C-r +to search backward in the history for a particular string. +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. +If that variable has not been assigned a value, the ESC and +C-j characters terminate an incremental search. +C-g aborts an incremental search and restores 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 +

              To find other matching entries in the history list, type C-r or +C-s as appropriate. +This searches 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 +Any other key sequence bound to a Readline command terminates +the search and executes that command. +For instance, a RET terminates the search and accepts 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. +

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

              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. +to search for matching history entries. +The search string may be typed by the user or be part of the contents of +the current line.


              -
              -
              +
              + -

              1.3 Readline Init File

              - +

              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 +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, Readline looks for +/etc/inputrc. +

              +

              When a program that uses the Readline library starts up, Readline reads +the init file and sets any variables and key bindings it contains. +

              +

              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

                +

                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
                +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. +using the set command within the init file. The syntax is simple:

                -
                set variable value
                +
                set variable value
                 

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

                -
                set editing-mode vi
                +
                set editing-mode vi
                 
                -

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

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

                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’. +A sample value might be ‘\e[0m’.

                -
                bell-style
                +
                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 +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 +

                bind-tty-special-chars
                +

                If set to ‘on’ (the default), Readline attempts to bind the control +characters that are +treated specially by the kernel’s terminal driver to their Readline equivalents. +These override the default Readline bindings described here. +Type ‘stty -a’ at a Bash prompt to see your current terminal settings, +including the special control characters (usually cchars).

                - -

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

                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 +

                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 +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 +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’. +The default is ‘off’.

                -
                colored-stats
                -

                If set to ‘on’, Readline displays possible completions using different +

                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 +The color definitions are taken from the value of the LS_COLORS environment variable. -The default is ‘off’. +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 "#". +

                comment-begin
                +

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

                -
                completion-display-width
                +
                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. +A value of 0 causes 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 +

                completion-ignore-case
                +

                If set to ‘on’, Readline performs filename matching and completion in a case-insensitive fashion. -The default value is ‘off’. +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 +

                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. +The default value is ‘off’. +

                +
                +
                completion-prefix-display-length
                +

                The maximum +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, Readline +replaces common prefixes longer than this value +with an ellipsis when displaying possible completions. +If a completion begins with a period, +and Readline is completing filenames, +it uses three underscores instead of an ellipsis. +

                +
                +
                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 asks whether or not the user wishes to view them; +otherwise, Readline simply lists the completions. 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, +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 converts characters it reads +that have the eighth bit set to an ASCII key sequence by +clearing the eighth bit and prefixing an ESC character, +converting them to a meta-prefixed key sequence. +The default value is ‘on’, but Readline sets it to ‘off’ +if the locale contains +characters whose encodings may include bytes with the eighth bit set. +This variable is dependent on the LC_CTYPE locale category, and +may change if the locale changes. +This variable also affects key bindings; +see the description of force-meta-prefix below. +

                +
                +
                disable-completion
                +

                If set to ‘On’, Readline inhibits word completion. +Completion characters are 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’. +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’. +

                editing-mode
                +

                The editing-mode variable controls the default set of +key bindings. +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, +

                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 +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 +The ‘\1’ and ‘\2’ escapes 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 ‘@’. +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. +

                enable-active-region
                +

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

                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 +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 tries 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 tries 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; +this variable checks for the terminal capability that indicates the +terminal can enable and disable a mode that sets the eighth bit of a +character (0200) if the Meta key is held down when the character is +typed (a meta character). +The default is ‘on’. +

                +
                +
                expand-tilde
                +

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

                +
                +
                force-meta-prefix
                +

                If set to ‘on’, Readline modifies its behavior when binding key +sequences containing \M- or Meta- +(see Key Bindings in Readline Init File Syntax) +by converting a key sequence of the form +\M-C or Meta-C to the two-character sequence +ESC C (adding the meta prefix). +If force-meta-prefix is set to ‘off’ (the default), +Readline uses the value of the convert-meta variable to determine +whether to perform this conversion: +if convert-meta is ‘on’, +Readline performs the conversion described above; +if it is ‘off’, Readline converts C to a meta character by +setting the eighth bit (0200). +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’. +same location on each history line retrieved with previous-history +or next-history. +The default is ‘off’.

                -
                history-size
                +
                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, +If you try 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’. +

                horizontal-scroll-mode
                +

                Setting this variable to ‘on’ means that the text of the lines +being edited will scroll horizontally on a single screen line when +the lines 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. +

                +input-meta
                +

                If set to ‘on’, Readline enables eight-bit input (that is, it +does 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 sets it to ‘on’ +if the locale contains characters whose encodings may include bytes +with the eighth bit set. +This variable is dependent on the LC_CTYPE locale category, and +its value may change if the locale changes. +The name meta-flag is a synonym for input-meta.

                -
                isearch-terminators
                +
                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. +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 terminate an incremental search.

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

                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 Readline doesn’t receive any input within the timeout, it uses 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). +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 +non-numeric value, Readline waits until another key is pressed to decide which key sequence to complete. -The default value is 500. +The default value is 500.

                -
                mark-directories
                -

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

                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-modified-lines
                +

                When this variable is set to ‘on’, Readline displays 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’. +

                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 +

                match-hidden-files
                +

                This variable, when set to ‘on’, forces 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. +If set to ‘off’, the user must include the leading ‘.’ +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 +

                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’. +the list. +The default is ‘off’.

                -
                output-meta
                -

                If set to ‘on’, Readline will display characters with the +

                output-meta
                +

                If set to ‘on’, Readline displays 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. +The default is ‘off’, but Readline sets it to ‘on’ +if the locale contains characters whose encodings may include +bytes with the eighth bit set. +This variable is dependent on the LC_CTYPE locale category, and +its value may change if the locale changes.

                -
                page-completions
                -

                If set to ‘on’, Readline uses an internal more-like pager +

                page-completions
                +

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

                -
                print-completions-horizontally
                -

                If set to ‘on’, Readline will display completions with matches +

                prefer-visible-bell
                +

                See bell-style. +

                +
                +
                print-completions-horizontally
                +

                If set to ‘on’, Readline displays completions with matches sorted horizontally in alphabetical order, rather than down the screen. -The default is ‘off’. +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, +

                revert-all-at-newline
                +

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

                -
                show-all-if-ambiguous
                -

                This alters the default behavior of the completion functions. If -set to ‘on’, +

                search-ignore-case
                +

                If set to ‘on’, Readline performs incremental and non-incremental +history list searches in a case-insensitive fashion. +The default value 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’. +The default value is ‘off’.

                -
                show-all-if-unmodified
                +
                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’, +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’. +The default value is ‘off’.

                -
                show-mode-in-prompt
                -

                If set to ‘on’, add a string to the beginning of the prompt +

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

                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’. +is after the first ‘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, +

                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 +The value is expanded like a key binding, so the standard set of +meta- and control- prefixes and backslash escape sequences is available. +The ‘\1’ and ‘\2’ escapes 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)’. +The default is ‘(cmd)’.

                -
                vi-ins-mode-string
                -

                If the show-mode-in-prompt variable is enabled, +

                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 +The value is expanded like a key binding, so the standard set of +meta- and control- prefixes and backslash escape sequences is available. +The ‘\1’ and ‘\2’ escapes 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)’. +The default is ‘(ins)’.

                -
                visible-stats
                -

                If set to ‘on’, a character denoting a file’s type +

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

                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.

                @@ -1000,135 +1087,142 @@ 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). +to a string that is inserted when the key is pressed (a macro). +The difference between a macro and a command is that a macro is +enclosed in single or double quotes.

                -
                -
                keynamefunction-name or macro
                -

                keyname is the name of a key spelled out in English. For example: +

                +
                keynamefunction-name or macro
                +

                keyname is the name of a key spelled out in English. +For example:

                -
                Control-u: universal-argument
                +
                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 +

                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, +‘> output’ into the line). +

                +

                This key binding syntax recognizes a number of symbolic character names: +DEL, +ESC, +ESCAPE, +LFD, +NEWLINE, +RET, +RETURN, +RUBOUT +(a destructive backspace), +SPACE, +SPC, and -TAB. +TAB.

                -
                "keyseq": function-name or macro
                -

                keyseq differs from keyname above in that strings +

                "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. +the key sequence in double quotes. +Some GNU Emacs style key escapes can be used, +as in the following example, but none of the +special character names are recognized.

                -
                "\C-u": universal-argument
                +
                "\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’. +

                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 +

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

                -
                -
                \C-
                -

                control prefix +

                +
                \C-
                +

                A control prefix.

                -
                \M-
                -

                meta prefix +

                \M-
                +

                Adding the meta prefix or converting the following character to a meta +character, as described above under force-meta-prefix +(see Variable Settings in Readline Init File Syntax).

                -
                \e
                -

                an escape character +

                \e
                +

                An escape character.

                -
                \\
                -

                backslash +

                \\
                +

                Backslash.

                -
                \"
                -

                ", a double quotation mark +

                \"
                +

                ", a double quotation mark.

                -
                \'
                -

                ', a single quote or apostrophe +

                \'
                +

                ', a single quote or apostrophe.

                -

                In addition to the GNU Emacs style escape sequences, a second +

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

                -
                -
                \a
                +
                +
                \a

                alert (bell)

                -
                \b
                +
                \b

                backspace

                -
                \d
                +
                \d

                delete

                -
                \f
                +
                \f

                form feed

                -
                \n
                +
                \n

                newline

                -
                \r
                +
                \r

                carriage return

                -
                \t
                +
                \t

                horizontal tab

                -
                \v
                +
                \v

                vertical tab

                -
                \nnn
                -

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

                \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) +

                \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. +The backslash escapes described above are expanded +in the macro body. 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: +including ‘"’ and ‘'’. +For example, the following binding will make ‘C-x \’ +insert a single ‘\’ into the line:

                -
                "\C-x\\": "\\"
                +
                "\C-x\\": "\\"
                 
                @@ -1136,97 +1230,105 @@ insert a single ‘\’ into the line:
                -
                -
                +
                + -

                1.3.2 Conditional Init Constructs

                +

                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. +of tests. +There are four parser directives available.

                -
                -
                $if
                -

                The $if construct allows bindings to be made based on the +

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

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

                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. +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 xterm to match both xterm and +xterm-256color, for instance.

                -
                version
                -

                The version test may be used to perform comparisons against +

                version
                +

                The version test may be used to perform comparisons against specific Readline versions. -The version expands to the current Readline version. +The version expands to the current Readline version. The set of comparison operators includes -‘=’ (and ‘==’), ‘!=’, ‘<=’, ‘>=’, ‘<’, -and ‘>’. +‘=’ (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 +minor version (e.g., ‘7.1’). +If the minor version is omitted, it +defaults to ‘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
                +
                $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 +

                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 +a specific program. +For instance, the following command adds a key sequence that quotes the current or previous word in Bash:

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

                The variable construct provides simple equality tests for Readline +

                variable
                +

                The variable construct provides simple equality tests for Readline variables and values. -The permitted comparison operators are ‘=’, ‘==’, and ‘!=’. +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 +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
                +
                $if editing-mode == emacs
                 set show-mode-in-prompt on
                 $endif
                 
                @@ -1234,40 +1336,40 @@ $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.

                -
                $else
                -

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

                $endif
                +

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

                -
                $include
                +
                $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: +and key bindings from that file. +For example, the following directive reads from /etc/inputrc:

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

                -
                -
                +
                + -

                1.3.3 Sample Init File

                +

                1.3.3 Sample Init File

                -

                Here is an example of an inputrc file. This illustrates key +

                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
                +
                # This file controls the behavior of line input editing for
                 # programs that use the GNU Readline library.  Existing
                 # programs include FTP, Bash, and GDB.
                 #
                @@ -1371,24 +1473,33 @@ $endif
                 
                -
                -
                +
                + -

                1.4 Bindable Readline Commands

                +

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

                -
                  +

                  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. +Readline +has the concept of an active region: +when the region is active, +Readline redisplay highlights the region using the +value of the +active-region-start-color +variable. +The enable-active-region variable turns this on and off. +Several commands set the region to active; those are noted below. +

                  +
                  -
                  -
                  +
                  + -

                  1.4.1 Commands For Moving

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

                  1.4.1 Commands For Moving

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

                  Move to the start of the current line. +This may also be bound to the Home key on some keyboards.

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

                  Move to the end of the line. +This may also be bound to the End key on some keyboards.

                  -
                  forward-char (C-f)
                  +
                  forward-char (C-f)

                  Move forward a character. +This may also be bound to the right arrow key on some keyboards.

                  -
                  backward-char (C-b)
                  +
                  backward-char (C-b)

                  Move back a character. +This may also be bound to the left arrow key on some keyboards.

                  -
                  forward-word (M-f)
                  +
                  forward-word (M-f)

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

                  -
                  backward-word (M-b)
                  +
                  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 ()
                  +
                  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 +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 ()
                  +
                  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 +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-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-screen (C-l)

                  Clear the screen, then redraw the current line, leaving the current line at the top of the screen. +If given a numeric argument, this refreshes the current line +without clearing the screen.

                  -
                  redraw-current-line ()
                  +
                  redraw-current-line ()

                  Refresh the current line. By default, this is unbound.

                  @@ -1468,133 +1587,143 @@ leaving the current line at the top of the screen.
                  -
                  -
                  +
                  + -

                  1.4.2 Commands For Manipulating The History

                  +

                  1.4.2 Commands For Manipulating The History

                  -
                  -
                  accept-line (Newline or Return)
                  +
                  +
                  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 +If this line is non-empty, you can add it to the history list using +add_history(). +If this line is a modified history line, then restore the history line to its original state.

                  -
                  previous-history (C-p)
                  +
                  previous-history (C-p)

                  Move ‘back’ through the history list, fetching the previous command. +This may also be bound to the up arrow key on some keyboards.

                  -
                  next-history (C-n)
                  +
                  next-history (C-n)

                  Move ‘forward’ through the history list, fetching the next command. +This may also be bound to the down arrow key on some keyboards.

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

                  Move to the first line in the history.

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

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

                  -
                  reverse-search-history (C-r)
                  +
                  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. +the history as necessary. +This is an incremental search. +This command sets the region to the matched text and activates the region.

                  -
                  forward-search-history (C-s)
                  +
                  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. +the history as necessary. +This is an incremental search. +This command sets the region to the matched text and activates the region.

                  -
                  non-incremental-reverse-search-history (M-p)
                  +
                  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)
                  +
                  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 +

                  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. +By default, this command is unbound, but may be bound to the Page Down +key on some keyboards.

                  -
                  history-search-backward ()
                  -

                  Search backward through the history for the string of characters +

                  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. +By default, this command is unbound, but may be bound to the Page Up +key on some keyboards.

                  -
                  history-substring-search-forward ()
                  -

                  Search forward through the history for the string of characters +

                  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.

                  -
                  history-substring-search-backward ()
                  -

                  Search backward through the history for the string of characters +

                  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.

                  -
                  yank-nth-arg (M-C-y)
                  +
                  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-_)
                  +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, +this uses the history expansion facilities to extract the +nth word, 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 +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. +the direction to move through the history. +A negative argument switches the direction through the history +(back or forward). +This uses the history expansion facilities to extract the +last word, as if the +‘!$’ history expansion had been specified.

                  -
                  operate-and-get-next (C-o)
                  +
                  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. +A numeric argument, if supplied, specifies the history entry +to use instead of the current line.

                  -
                  fetch-history ()
                  +
                  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. @@ -1604,231 +1733,239 @@ Without an argument, move back to the first entry in the history list.


                  -
                  -
                  +
                  + -

                  1.4.3 Commands For Changing Text

                  +

                  1.4.3 Commands For Changing Text

                  -
                  -
                  end-of-file (usually C-d)
                  +
                  +
                  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 +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. +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 +

                  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. +This may also be bound to the Delete key on some keyboards.

                  -
                  backward-delete-char (Rubout)
                  -

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

                  backward-delete-char (Rubout)
                  +

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

                  -
                  forward-backward-delete-char ()
                  +
                  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. +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. +

                  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)
                  +
                  tab-insert (M-TAB)

                  Insert a tab character.

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

                  Insert yourself. +

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

                  Insert the character typed.

                  -
                  bracketed-paste-begin ()
                  +
                  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 +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. +to the inserted text. +It sets the active region.

                  -
                  transpose-chars (C-t)
                  +
                  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 +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)
                  +
                  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, +

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

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

                  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 +

                  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 +Characters bound to backward-delete-char replace the character before point with a space.

                  -

                  By default, this command is unbound. +

                  By default, this command is unbound, but may be bound to the Insert +key on some keyboards.


                  -
                  -
                  +
                  + -

                  1.4.4 Killing And Yanking

                  +

                  1.4.4 Killing And Yanking

                  -
                  -
                  kill-line (C-k)
                  -

                  Kill the text from point to the end of the line. +

                  +
                  kill-line (C-k)
                  +

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

                  -
                  backward-kill-line (C-x Rubout)
                  +
                  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. +end of the line.

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

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

                  -
                  kill-whole-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-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. +Word boundaries are the same as forward-word.

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

                  Kill the word behind point. -Word boundaries are the same as backward-word. +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-word-rubout (C-w)
                  +

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

                  -
                  unix-filename-rubout ()
                  +
                  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. +as the word boundaries, +saving the killed text on the kill-ring.

                  -
                  delete-horizontal-space ()
                  -

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

                  delete-horizontal-space ()
                  +

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

                  -
                  kill-region ()
                  +
                  kill-region ()

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

                  -
                  copy-region-as-kill ()
                  +
                  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. +right away. +By default, this command is unbound.

                  -
                  copy-backward-word ()
                  +
                  copy-backward-word ()

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

                  -
                  copy-forward-word ()
                  +
                  copy-forward-word ()

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

                  -
                  yank (C-y)
                  +
                  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. +

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

                  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. +argument. +M-- starts a negative argument.

                  -
                  universal-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 +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 @@ -1842,58 +1979,88 @@ By default, this is not bound to a key.


                  -
                  -
                  +
                  + -

                  1.4.6 Letting Readline Type For You

                  +

                  1.4.6 Letting Readline Type For You

                  -
                  -
                  complete (TAB)
                  +
                  +
                  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-?)
                  +
                  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. +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-completions (M-*)

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

                  -
                  menu-complete ()
                  -

                  Similar to complete, but replaces the word to be completed +

                  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 +Repeatedly executing 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 +At the end of the list of completions, +menu-complete rings the bell +(subject to the setting of bell-style) +and restores the original text. +An argument of n moves n positions forward in the list +of matches; a negative argument moves 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 +

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

                  +
                  +
                  export-completions ()
                  +

                  Perform completion on the word before point as described above +and write the list of possible completions to Readline’s output stream +using the following format, writing information on separate lines: +

                  +
                    +
                  • the number of matches N; +
                  • the word being completed; +
                  • S:E, +where S and E are the start and end offsets of the word +in the Readline line buffer; then +
                  • each match, one per line +
                  + +

                  If there are no matches, the first line will be “0”, +and this command does not print any output after the S:E. +If there is only a single match, this prints a single line containing it. +If there is more than one match, this prints the common prefix of the +matches, which may be empty, on the first line after the S:E, +then the matches on subsequent lines. +In this case, N will include the first line with the common prefix. +

                  +

                  The user or application +should be able to accommodate the possibility of a blank line. +The intent is that the user or application reads N lines after +the line containing S:E to obtain the match list. +This command is unbound by default.

                  -
                  delete-char-or-list ()
                  +
                  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. +end of the line (like delete-char). +At the end of the line, it behaves identically to possible-completions. This command is unbound by default.

                  @@ -1901,150 +2068,167 @@ This command is unbound by default.
                  -
                  -
                  +
                  + -

                  1.4.7 Keyboard Macros

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

                  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 ))
                  +
                  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)
                  +
                  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-last-kbd-macro ()

                  Print the last keyboard macro defined in a format suitable for the -inputrc file. +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 +

                  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 (C-g)

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

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

                  If the metafied character x is upper case, run the command +

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

                  prefix-meta (ESC)
                  +

                  Metafy the next character typed. +Typing ‘ESC f’ is equivalent to typing M-f.

                  -
                  undo (C-_ or C-x C-u)
                  +
                  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. +

                  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 initial state.

                  -
                  tilde-expand (M-~)
                  +
                  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. +

                  set-mark (C-@)
                  +

                  Set the mark to the point. +If a numeric argument is supplied, set the mark 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. +

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

                  Swap the point with the mark. +Set the current cursor position to the saved position, +then set the mark to the old cursor position.

                  -
                  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 (C-])
                  +

                  Read a character and move point 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. +

                  character-search-backward (M-C-])
                  +

                  Read a character and move point to the previous occurrence of that character. +A negative argument searches for subsequent occurrences.

                  -
                  skip-csi-sequence ()
                  +
                  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. +defined for keys like Home and End. +CSI sequences begin with a Control Sequence Indicator (CSI), usually +ESC [. +If this sequence is bound to "\e[", +keys producing CSI sequences 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, insert the value of the comment-begin +variable 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. +of comment-begin, insert the value; otherwise delete +the characters in comment-begin 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, +

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

                  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. +of an inputrc file. +This command is unbound by default.

                  -
                  dump-macros ()
                  +
                  dump-macros ()

                  Print all of the Readline key sequences bound to macros and the -strings they output. If a numeric argument is supplied, +strings they output +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. +of an inputrc file. +This command is unbound by default. +

                  +
                  +
                  execute-named-command (M-x)
                  +

                  Read a bindable Readline command name from the input and execute the +function to which it’s bound, as if the key sequence to which it was +bound appeared in the input. +If this function is supplied with a numeric argument, it passes that +argument to the function it executes.

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

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

                  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 +

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

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

                  @@ -2054,28 +2238,29 @@ editing mode.
                  -
                  -
                  +
                  + -

                  1.5 Readline vi Mode

                  +

                  1.5 Readline vi Mode

                  -

                  While the Readline library does not have a full set of vi +

                  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. +of the line. +The Readline vi mode behaves as specified in the +sh description 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. +

                  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 +

                  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 +line with the standard vi movement keys, move to previous +history lines with ‘k’ and subsequent lines with ‘j’, and so forth.

                  @@ -2083,21 +2268,21 @@ so forth.
                  -
                  -
                  +
                  + -

                  2 Programming with GNU Readline

                  +

                  2 Programming with GNU Readline

                  -

                  This chapter describes the interface between the GNU Readline Library and +

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

                    +

                    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 +

                    Many programs provide a command line interface, such as mail, +ftp, and sh. +For such programs, the default behavior 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(). +fgets().

                    - - + + -

                    The function readline() prints a prompt prompt +

                    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 +Since it’s possible to enter characters into the line while quoting +them to disable any Readline editing function they might normally have, +this line may include embedded newlines and other special characters. +If prompt is NULL or the empty string, +readline() does not display a prompt. +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);
                    +
                    char *readline (const char *prompt);
                     

                    So, one might say

                    -
                    char *line = readline ("Enter a line: ");
                    +
                    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. +This means that lines consisting of a newline return the empty string.

                    -

                    If readline encounters an EOF while reading the line, and the -line is empty at that point, then (char *)NULL is returned. +

                    If Readline encounters an EOF while reading the line, +and the line is empty at that point, +then readline() returns (char *)NULL. 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 +

                    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. +C-p for example), you must call add_history() to save the +line away in a history list of such lines.

                    -
                    add_history (line);
                    +
                    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 +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. */
                    +
                    /* A static variable for holding the line. */
                     static char *line_read = (char *)NULL;
                     
                     /* Read a string, and return a pointer to it.
                    @@ -2195,76 +2388,81 @@ rl_gets ()
                     }
                     
                    -

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

                    This function gives the user the default behavior of TAB +completion: filename completion. +If you do not want Readline to +complete 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);
                    +
                    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 +

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

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

                    -
                    rl_bind_key ('\t', rl_insert);
                    +
                    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 +might write a function called initialize_readline() which performs this and other desired initializations, such as installing -custom completers (see Custom Completers). +custom completers (see Custom Completers).


                    -
                    -
                    +
                    + -

                    2.2 Custom Functions

                    +

                    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 +programs. +This section describes the various functions and variables +defined within the Readline library which allow a 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 +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 program +should include the file <stdio.h> +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 +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. +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. +RL_READLINE_VERSION would be 0x0402.

                    -
                      +
                      -
                      -
                      +
                      + -

                      2.2.1 Readline Typedefs

                      +

                      2.2.1 Readline Typedefs

                      For readability, we declare a number of new object types, all pointers to functions. @@ -2273,71 +2471,76 @@ to functions. 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). +

                      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)(); +

                      int (*func)();

                      or the ANSI-C style declaration

                      -

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

                      int (*func)(int, int);

                      we may write

                      -

                      rl_command_func_t *func; +

                      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 **);
                      +
                      +
                      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 void rl_macro_print_func_t (const char *, const char *, int, const char *);
                      +
                      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 **);
                      +

                      The rltypedefs.h file has more documentation for these types. +


                      -
                      -
                      +
                      + -

                      2.2.2 Writing a New Function

                      +

                      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 +

                      The calling sequence for a command foo looks like

                      -
                      int foo (int count, int key)
                      +
                      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. +

                      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 +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 +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 @@ -2345,434 +2548,465 @@ 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. +All of the builtin Readline bindable command functions +obey this convention.


                      -
                      -
                      +
                      + -

                      2.3 Readline Variables

                      +

                      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: 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 will 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_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_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_mark
                      +

                      The mark (saved position) in the current line. +If set, the mark and point define a region. +Some Readline commands set the mark as part of operating; +users can also set the mark explicitly.

                      -
                      -
                      Variable: int rl_done
                      +
                      +
                      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. +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 +

                      +
                      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 has encountered a read error or EOF 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 +

                      +
                      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. +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_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
                      +
                      +
                      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 +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
                      +
                      +
                      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 +the only character on an otherwise-empty line. +This moves the cursor 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(). +Readline performs some prompt expansions and analyzes the prompt for +line breaks, so rl_set_prompt() is preferred. +

                      + +
                      +
                      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
                      +
                      +
                      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 +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 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: const char * rl_library_version
                      +

                      The version number of this revision of the Readline library, as a string +(e.g., "4.2").

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

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

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

                      +
                      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. +Readline uses this to look up the terminal capabilities it needs in +the terminfo database.

                      -
                      -
                      Variable: const char * rl_readline_name
                      +
                      +
                      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). +(see Conditional Init Constructs).

                      -
                      -
                      Variable: FILE * rl_instream
                      +
                      +
                      Variable: FILE * rl_instream

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

                      -
                      -
                      Variable: FILE * rl_outstream
                      +
                      +
                      Variable: FILE * rl_outstream

                      The stdio stream to which Readline performs output. -If NULL, Readline defaults to stdout. +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 +

                      +
                      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_command_func_t * rl_last_func
                      +

                      The address of the last command function Readline executed. +This 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
                      +
                      +
                      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. +before Readline prints the first prompt.

                      -
                      -
                      Variable: rl_hook_func_t * rl_pre_input_hook
                      +
                      +
                      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 +the first prompt has been printed and just before Readline starts reading input characters.

                      -
                      -
                      Variable: rl_hook_func_t * rl_event_hook
                      +
                      +
                      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
                      +
                      +
                      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. +to get a character from the input stream. +By default, it is set to rl_getc, the 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
                      +
                      +
                      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. +call is interrupted by a signal when Readline is reading terminal input.

                      -
                      -
                      Variable: rl_hook_func_t * rl_timeout_event_hook
                      +
                      +
                      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
                      +
                      +
                      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 +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 function must return zero if there is no input available, and non-zero +if input is available. 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. +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 +(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 +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. +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 +

                      +
                      Variable: rl_voidfunc_t * rl_redisplay_function
                      +

                      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). +By default, it is set to rl_redisplay, the default Readline +redisplay function (see Redisplay).

                      -
                      -
                      Variable: rl_vintfunc_t * rl_prep_term_function
                      +
                      +
                      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). +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
                      +
                      +
                      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). +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 +

                      +
                      Variable: void rl_macro_display_hook
                      +

                      If set, this points to a function that rl_macro_dumper will call to +display a key sequence bound to a macro. +It is called with the key sequence, the "untranslated" macro value (i.e., +with backslash escapes included, as when passed to rl_macro_bind), +the readable argument passed to rl_macro_dumper, and any +prefix to display before the key sequence. +

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

                      +
                      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
                      +
                      +
                      Variable: char * rl_executing_macro

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

                      -
                      -
                      Variable: int rl_executing_key
                      +
                      +
                      Variable: int rl_executing_key

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

                      -
                      -
                      Variable: char * rl_executing_keyseq
                      +
                      +
                      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_key_sequence_length
                      +

                      The number of characters in rl_executing_keyseq.

                      -
                      -
                      Variable: int rl_readline_state
                      +
                      +
                      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
                      +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
                      +
                      RL_STATE_INITIALIZING

                      Readline is initializing its internal data structures.

                      -
                      RL_STATE_INITIALIZED
                      +
                      RL_STATE_INITIALIZED

                      Readline has completed its initialization.

                      -
                      RL_STATE_TERMPREPPED
                      +
                      RL_STATE_TERMPREPPED

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

                      -
                      RL_STATE_READCMD
                      +
                      RL_STATE_READCMD

                      Readline is reading a command from the keyboard.

                      -
                      RL_STATE_METANEXT
                      +
                      RL_STATE_METANEXT

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

                      -
                      RL_STATE_DISPATCHING
                      +
                      RL_STATE_DISPATCHING

                      Readline is dispatching to a command.

                      -
                      RL_STATE_MOREINPUT
                      +
                      RL_STATE_MOREINPUT

                      Readline is reading more input while executing an editing command.

                      -
                      RL_STATE_ISEARCH
                      +
                      RL_STATE_ISEARCH

                      Readline is performing an incremental history search.

                      -
                      RL_STATE_NSEARCH
                      +
                      RL_STATE_NSEARCH

                      Readline is performing a non-incremental history search.

                      -
                      RL_STATE_SEARCH
                      +
                      RL_STATE_SEARCH

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

                      -
                      RL_STATE_NUMERICARG
                      +
                      RL_STATE_NUMERICARG

                      Readline is reading a numeric argument.

                      -
                      RL_STATE_MACROINPUT
                      +
                      RL_STATE_MACROINPUT

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

                      -
                      RL_STATE_MACRODEF
                      +
                      RL_STATE_MACRODEF

                      Readline is currently reading characters defining a keyboard macro.

                      -
                      RL_STATE_OVERWRITE
                      +
                      RL_STATE_OVERWRITE

                      Readline is in overwrite mode.

                      -
                      RL_STATE_COMPLETING
                      +
                      RL_STATE_COMPLETING

                      Readline is performing word completion.

                      -
                      RL_STATE_SIGHANDLER
                      -

                      Readline is currently executing the readline signal handler. +

                      RL_STATE_SIGHANDLER
                      +

                      Readline is currently executing the Readline signal handler.

                      -
                      RL_STATE_UNDOING
                      +
                      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_INPUTPENDING
                      +

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

                      -
                      RL_STATE_TTYCSAVED
                      +
                      RL_STATE_TTYCSAVED

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

                      -
                      RL_STATE_CALLBACK
                      +
                      RL_STATE_CALLBACK

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

                      -
                      RL_STATE_VIMOTION
                      +
                      RL_STATE_VIMOTION

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

                      -
                      RL_STATE_MULTIKEY
                      +
                      RL_STATE_MULTIKEY

                      Readline is reading a multiple-keystroke command.

                      -
                      RL_STATE_VICMDONCE
                      +
                      RL_STATE_VICMDONCE

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

                      -
                      RL_STATE_DONE
                      -

                      Readline has read a key sequence bound to accept-line +

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

                      RL_STATE_EOF
                      +

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

                      -
                      -
                      Variable: int rl_explicit_arg
                      +
                      +
                      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. +the user. +It is only valid in a bindable command function.

                      -
                      -
                      Variable: int rl_numeric_arg
                      +
                      +
                      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. +before executing the current Readline function. +It is 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. +

                      +
                      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. +This determines the current keymap and key bindings.

                      -
                      -
                      -
                      +
                      + -

                      2.4 Readline Convenience Functions

                      +

                      2.4 Readline Convenience Functions

                      -
                        +
                        -
                        -
                        +
                        + -

                        2.4.1 Naming a Function

                        +

                        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 +

                        Readline has a descriptive +string name for every function a user can bind to a key sequence, +so users can dynamically change the bindings associated with key +sequences while using Readline, +using the descriptive name when referring to the function. +Thus, in an init file, one might find

                        -
                        Meta-Rubout:	backward-kill-word
                        +
                        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: +

                        This binds the keystroke Meta-Rubout to the function +descriptively named backward-kill-word. +As the programmer, you +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(). +

                        +
                        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 by key sequences +that bind to name. +If key is not -1, then bind it to +function using rl_bind_key().

                        Using this function alone is sufficient for most applications. @@ -2825,1009 +3064,1071 @@ you may need to use the underlying functions described below.


                        -
                        -
                        +
                        + -

                        2.4.2 Selecting a Keymap

                        +

                        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 +

                        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_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_copy_keymap (Keymap map)
                        +

                        Return a new keymap which is a copy of map.

                        -
                        -
                        Function: Keymap rl_make_keymap (void)
                        +
                        +
                        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_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: void rl_free_keymap (Keymap keymap)
                        +

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

                        -
                        -
                        Function: int rl_empty_keymap (Keymap keymap)
                        -

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

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

                        Readline has several internal keymaps. +These functions allow you to change which keymap is active. +This is one way to switch editing modes, for example.

                        -
                        -
                        Function: Keymap rl_get_keymap (void)
                        +
                        +
                        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: 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: 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: 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; +

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

                        +

                        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 +

                        Key sequences are associated 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 +

                        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). +installed before the first call to readline() will be overridden. +An alternate mechanism that can avoid this +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 (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_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 +

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

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

                        +
                        Function: int rl_unbind_key (int key)
                        +

                        Bind key to the null function in the currently active keymap. +This is not the same as binding it to self-insert. 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. +

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

                        Bind key to the null function in map. +This is not the same as binding it to self-insert. 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_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_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. +

                        +
                        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. +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_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 in map. +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_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 +

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

                        +
                        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_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. +Returns non-zero in the case of an invalid keyseq, zero otherwise.

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

                        Parse line as if it had been read from the inputrc file and +

                        +
                        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). +(see Readline Init File).

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

                        Read keybindings and variable assignments from filename -(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

                        +

                        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 +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. +name is a descriptive name users might use in a key binding. +

                        + +
                        +
                        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, this uses the current keymap. +If type is not NULL, this returns the type of the object +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 +rl_numeric_arg) while traversing the key sequence that invoked the current command.

                        -
                        -
                        Function: char ** rl_invoking_keyseqs (rl_command_func_t *function)
                        +
                        +
                        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. +invoke function in the current keymap.

                        -
                        -
                        Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map)
                        +
                        +
                        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. +invoke function in the keymap map. +

                        + +
                        +
                        Function: void rl_print_keybinding (const char *name, Keymap map, int readable)
                        +

                        Print key sequences bound to Readline function name name in +keymap map. +If map is NULL, this uses the current keymap. +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 to recreate the key binding.

                        -
                        -
                        Function: void rl_function_dumper (int readable)
                        +
                        +
                        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, +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. +inputrc file and re-read.

                        -
                        -
                        Function: void rl_list_funmap_names (void)
                        -

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

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

                        +
                        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. +This returns the index of the newly-added name in the array of +function names.


                        -
                        -
                        +
                        + -

                        2.4.5 Allowing Undoing

                        +

                        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. +functions much more useful. +It is certainly easier 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 your function simply inserts text once, or deletes text once, +and uses rl_insert_text() or rl_delete_text() to do it, +then Readline does the undoing 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(). +This is done with rl_begin_undo_group() and +rl_end_undo_group().

                        -

                        The types of events that can be undone are: +

                        The types of events Readline can undo are:

                        -
                        -
                        enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; 
                        +
                        +
                        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(). +

                        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(); +they are how Readline delimits groups of commands that should be +undone together.

                        -
                        -
                        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_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: 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_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)
                        +
                        +
                        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. +

                        +
                        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. +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. +Readline will create an undo group for you.

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

                        +
                        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

                        +

                        2.4.6 Redisplay

                        -
                        -
                        Function: void rl_redisplay (void)
                        +
                        +
                        Function: void rl_redisplay (void)

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

                        -
                        -
                        Function: int rl_forced_update_display (void)
                        +
                        +
                        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)
                        +
                        +
                        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)
                        +
                        +
                        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. +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. +It should be used after setting rl_already_prompted.

                        -
                        -
                        Function: int rl_clear_visible_line (void)
                        +
                        +
                        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)
                        +
                        +
                        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)
                        +
                        +
                        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. +

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

                        +
                        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 +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: 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, +you must call rl_restore_prompt before calling this function.

                        -
                        -
                        Function: void rl_save_prompt (void)
                        +
                        +
                        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(). +displaying a new message in the message area with rl_message().

                        -
                        -
                        Function: void rl_restore_prompt (void)
                        +
                        +
                        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. +recent call to rl_save_prompt. +If you called rl_save_prompt to save the prompt before a call +to rl_message, you should call this function 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 +

                        +
                        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. +This function is called by readline(). +It may also be called to +expand the primary prompt if the application uses the +rl_on_new_line_with_prompt() function or +rl_already_prompted variable. 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). +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. +If you don’t use these indicators, redisplay will likely produce screen +contents that don’t match the line buffer.

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

                        +
                        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

                        +

                        2.4.7 Modifying Text

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

                        Insert text into the line at the current cursor position. +

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

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

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

                        +
                        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. +last command was a kill command. +This deletes the text from the line. +If start is less than end, the text is appended, +otherwise it is prepended. +If the last command was not a kill, this uses a new kill ring slot. +

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

                        Replace the contents of rl_line_buffer with text. +This preserves the point and mark, if possible. +If clear_undo is non-zero, this clears the undo list associated +with the current line.

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

                        +
                        Function: int rl_push_macro_input (char *macro)
                        +

                        Insert macro 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

                        +

                        2.4.8 Character Input

                        -
                        -
                        Function: int rl_read_key (void)
                        +
                        +
                        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. +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. +the rl_event_hook variable.

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

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

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

                        +
                        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(). +Applications can push back up to 512 characters. +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_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_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 +

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

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

                        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 +and perform redisplay. +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 +

                        +
                        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(). +rl_prep_terminal().

                        -
                        -
                        Function: void rl_tty_set_default_bindings (Keymap kmap)
                        +
                        +
                        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. +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: 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. +

                        +
                        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)
                        +
                        +
                        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. +terminal_name as the terminal type (e.g., xterm). +If terminal_name is NULL, Readline uses the value of the +TERM environment variable.


                        -
                        -
                        +
                        + -

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

                        +
                        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: 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_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_free (void *mem)
                        +

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

                        -
                        -
                        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: void rl_extend_line_buffer (int len)
                        +

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

                        -
                        -
                        Function: int rl_initialize (void)
                        +
                        +
                        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. +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_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: 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)
                        +
                        +
                        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). +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. +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. +

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

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

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

                        +
                        Function: int _rl_digit_value (int c)
                        +

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


                        -
                        -
                        +
                        + -

                        2.4.11 Miscellaneous 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: 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)
                        +
                        +
                        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. +the current keymap, to rl_outstream. +If the application has assigned a value to rl_macro_display_hook, +rl_macro_dumper calls it instead of printing anything. +If readable is greater than 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. +

                        +
                        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). +‘set variable value’ had been executed in an inputrc +file (see Readline Init File Syntax) +or by rl_parse_and_bind.

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

                        +
                        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. +terminal-specific operations, like erasing a line. +Readline does not fetch or use all of a terminal’s capabilities, +and this function will return +values for only those capabilities Readline fetches. +

                        + +
                        +
                        Function: void rl_reparse_colors (void)
                        +

                        Read or re-read color definitions from LS_COLORS.

                        -
                        -
                        Function: void rl_clear_history (void)
                        +
                        +
                        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 +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). +

                        +
                        Function: void rl_activate_mark (void)
                        +

                        Enable an active region. +When this is enabled, the text between point and mark (the region) is +displayed using the color specified by the value of the +active-region-start-color variable (a face). +The default face is the terminal’s standout mode. 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_deactivate_mark (void)
                        +

                        Turn off the active region.

                        -
                        -
                        Function: void rl_keep_mark_active (void)
                        +
                        +
                        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)
                        +
                        +
                        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)
                        +

                        2.4.12 Alternate Interface

                        + +

                        For applications that need more granular control than +plain readline() provides, there is +an alternate interface. +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 use case, 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 *line_handler)

                        Set up the terminal for Readline I/O and display the initial -expanded value of prompt. Save the value of lhandler to +expanded value of prompt. +Save the value of line_handler 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 +As with readline(), the handler function should free the line when it it finished with it.

                        -
                        -
                        Function: void rl_callback_read_char (void)
                        +
                        +
                        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 +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, +If that character completes the line, rl_callback_read_char will +invoke the line_handler function installed by +rl_callback_handler_install to process the line. +Before calling the line_handler function, Readline resets +the terminal settings to the values they had before calling +rl_callback_handler_install. +If the line_handler 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. +Readline modifies the terminal settings for its use again. +EOF is indicated by calling line_handler with a +NULL line.

                        -
                        -
                        Function: void rl_callback_sigcleanup (void)
                        +
                        +
                        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. +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)
                        +
                        +
                        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. +If the line_handler installed by rl_callback_handler_install +does not exit the program, your program should call +either this function or the function referred +to by the value of rl_deprep_term_function +before the program exits to reset the terminal settings.


                        -
                        -
                        +
                        + -

                        2.4.13 A Readline Example

                        +

                        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 +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. */
                        +
                        /* Invert the case of the COUNT following characters. */
                         int
                         invert_case_line (count, key)
                              int count, key;
                         {
                        -  register int start, end, i;
                        +  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);
                        +  end = start + count;
                         
                           /* Force it to be within range. */
                           if (end > rl_end)
                        @@ -3838,6 +4139,11 @@ invert_case_line (count, key)
                           if (start == end)
                             return (0);
                         
                        +  /* For positive arguments, put point after the last changed character. For
                        +     negative arguments, put point before the last changed character. */
                        +  rl_point = end;
                        +
                        +  /* Swap start and end if we are moving backwards */
                           if (start > end)
                             {
                               int temp = start;
                        @@ -3856,20 +4162,19 @@ invert_case_line (count, key)
                               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

                        +

                        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 @@ -3877,11 +4182,10 @@ standard history and TAB completion functions. It understands the EOF character or "exit" to exit the program.

                        -
                        /* Standard include files. stdio.h is required. */
                        +
                        /* 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>
                        @@ -3889,12 +4193,19 @@ It understands the EOF character or "exit" to exit the program.
                         
                         #include <signal.h>
                         
                        +#include <errno.h>
                         #include <stdio.h>
                         
                        +#include <locale.h>
                        +
                         /* Standard readline include files. */
                         #include <readline/readline.h>
                         #include <readline/history.h>
                         
                        +#if !defined (errno)
                        +extern int errno;
                        +#endif
                        +
                         static void cb_linehandler (char *);
                         static void sighandler (int);
                         
                        @@ -3962,7 +4273,7 @@ main (int c, char **v)
                           while (running)
                             {
                               FD_ZERO (&fds);
                        -      FD_SET (fileno (rl_instream), &fds);    
                        +      FD_SET (fileno (rl_instream), &fds);
                         
                               r = select (FD_SETSIZE, &fds, NULL, NULL, NULL);
                               if (r < 0 && errno != EINTR)
                        @@ -3991,533 +4302,572 @@ main (int c, char **v)
                         
                        -
                        -
                        +
                        + -

                        2.5 Readline Signal Handling

                        +

                        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. +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 applications using +Readline 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 +number of signals (SIGINT, SIGQUIT, SIGTERM, +SIGHUP, +SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU). +When Readline receives one of these signals, 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 +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 +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). +aborted (see the description of rl_free_line_state() below).

                        -

                        There is an additional Readline signal handler, for SIGWINCH, which +

                        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. +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. +(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 +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. +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. +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. +does not need to do any processing +between calls to rl_callback_read_char, +setting this variable may be appropriate.

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

                        -

                        The default value of rl_catch_signals is 1. +

                        The default value of rl_catch_signals is 1.

                        -
                        -
                        Variable: int rl_catch_sigwinch
                        +
                        +
                        Variable: int rl_catch_sigwinch

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

                        -

                        The default value of rl_catch_sigwinch is 1. +

                        The default value of rl_catch_sigwinch is 1.

                        -
                        -
                        Variable: int rl_persistent_signal_handlers
                        +
                        +
                        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, +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. +

                        The default value of rl_persistent_signal_handlers is 0.

                        -
                        -
                        Variable: int rl_change_environment
                        +
                        +
                        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 +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. +

                        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, +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)
                        +
                        +
                        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)
                        +
                        +
                        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. +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)
                        +
                        +
                        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. +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)
                        +
                        +
                        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. +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() +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 +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 +

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

                        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)
                        +
                        +
                        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 with sig set to SIGINT, SIGQUIT, or +SIGTSTP will display the character generating that signal.

                        -
                        -
                        Function: void rl_resize_terminal (void)
                        +
                        +
                        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. +

                        +
                        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 doesn’t change that terminal dimension. 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 +

                        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)
                        +
                        +
                        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)
                        +
                        +
                        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_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)
                        +
                        +
                        Function: int rl_clear_signals (void)

                        Remove all of the Readline signal handlers installed by -rl_set_signals(). +rl_set_signals().


                        -
                        -
                        +
                        + -

                        2.6 Custom Completers

                        - +

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

                          +

                          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 +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 +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 +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. +
                              +
                            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. +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 +
                            3. 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. +rl_completion_entry_function.
                            4. 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 +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 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. +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. +

                            +
                            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
                            +
                            +
                            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. +rl_completion_matches(). +If the value of rl_completion_entry_function is +NULL then Readline uses the default filename generator +function, rl_filename_completion_function(). +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

                          +

                          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)
                          +
                          +
                          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 does not list possible completions +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 ‘*’. +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. +

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

                          +
                          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

                          +

                          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(), +

                          +
                          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
                          +
                          +
                          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 +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 +completion will use the array of strings this function returns. +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
                          +
                          +
                          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
                          +application-specific fashion. +Readline calls this function during filename completion +if 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 if they decide to quote +the filename in a different style. +It’s preferable to preserve the user’s quoting as much as possible – +it’s less disruptive. +

                          + +
                          +
                          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. +characters from a filename before attempting completion, +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 a quoted string.

                          -
                          -
                          Variable: rl_linebuf_func_t * rl_char_is_quoted_p
                          +
                          +
                          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 +mechanism the application 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 +

                          +
                          Variable: rl_compignore_func_t * rl_ignore_some_completions_function
                          +

                          Readline calls this function, if defined, when 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. +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 +must free each element it deletes from the array.

                          -
                          -
                          Variable: rl_icppfunc_t * rl_directory_completion_hook
                          +
                          +
                          Variable: rl_icppfunc_t * rl_directory_completion_hook

                          This function, if defined, is allowed to modify the directory portion -of filenames Readline completes. +of filenames during completion. 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. +If the function replaces the string with a new string, it +should free the old value. 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(). +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;
                          +
                          +
                          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. +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 Readline displays when it prints or inserts +the possible completions. +Readline calls this 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(). +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
                          +
                          +
                          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 modifies its filename name argument, and Readline passes +the modified value 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 @@ -4525,248 +4875,314 @@ 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 +

                          +
                          Variable: rl_dequote_func_t * rl_filename_rewrite_hook
                          +

                          If non-zero, this is the address of a function +for Readline to call 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. +them to the filename portion of the partial word being completed. +It modifies the filesystem entries, +as opposed to rl_completion_rewrite_hook, +which modifies the word being completed. +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
                          +or the converted filename in newly-allocated memory. +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. +Readline compares the converted form against the word to be completed, +and, if it matches, adds it to the list of matches. +Readline will free the allocated string. +

                          + +
                          +
                          Variable: rl_dequote_func_t * rl_completion_rewrite_hook
                          +

                          If non-zero, this is the address of a function +for Readline to call before +comparing the filename portion of a word to be completed with directory +entries from the filesystem. +It modifies the word being completed, +as opposed to rl_filename_rewrite_hook, +which modifies filesystem entries. +The function takes two arguments: +fname, the word to be converted, +after any rl_filename_dequoting_function has been applied, +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 function should perform any necessary application or system-specific +conversion on the filename, such as converting between character sets or +converting from a character input format to some other format. +Readline compares the converted form against directory entries, after +their potential modification by rl_filename_rewrite_hook, +and adds any matches 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. +Readline calls this function instead of displaying the list itself. 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, +(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
                          +
                          +
                          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 +completer routine. +The default value of this variable is the characters which break words for completion in Bash: -" \t\n\"\\'`@$><=;|&{(". +" \t\n\"\\'`@$><=;|&{(".

                          -
                          -
                          Variable: const char * rl_basic_quote_characters
                          +
                          +
                          Variable: const char * rl_basic_quote_characters

                          A list of quote characters which can cause a word break. +The default value includes single and double quotes.

                          -
                          -
                          Variable: const char * rl_completer_word_break_characters
                          +
                          +
                          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. +rl_complete_internal(). +These characters determine how Readline decides what to complete. +The default list is the value of +rl_basic_word_break_characters.

                          -
                          -
                          Variable: rl_cpvfunc_t * rl_completion_word_break_hook
                          +
                          +
                          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
                          +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, Readline uses +rl_completer_word_break_characters. +

                          + +
                          +
                          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, +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_filename_quote_characters
                          +

                          A list of characters that cause Readline to quote a filename +when they appear in a completed filename. +The default is the null string.

                          -
                          -
                          Variable: const char * rl_special_prefixes
                          +
                          +
                          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. +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 +

                          +
                          Variable: int rl_completion_query_items
                          +

                          This determines the maximum number of items +that possible-completions will display unconditionally. +If there are more possible completions than this, +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
                          +
                          +
                          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. +line, Readline appends this character 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. +It is set to the default before calling any application-specific completion +function, 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 +

                          +
                          Variable: int rl_completion_suppress_append
                          +

                          If non-zero, Readline will not append the +rl_completion_append_character 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. +It is set to 0 before calling any application-specific completion function, +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
                          +
                          +
                          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. +It is set to 0 before calling any application-specific completion function, +and may only be changed within such a function.

                          -
                          -
                          Variable: int rl_completion_found_quote
                          +
                          +
                          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. +This is set before calling any application-specific completion 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 it found. +This is set before calling any application-specific completion function.

                          -
                          - -

                          If non-zero, a slash will be appended to completed filenames that are +

                          + +

                          If non-zero, Readline appends a slash to completed filenames that are symbolic links to directory names, subject to the value of the -user-settable mark-directories variable. +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. +mark-symlinked-directories Readline variable) if appropriate. +This variable is set to the user’s preference before calling any +application-specific completion function, +so unless that function modifies the value, +Readline will honor the user’s preferences.

                          -
                          -
                          Variable: int rl_ignore_completion_duplicates
                          -

                          If non-zero, then duplicates in the matches are removed. +

                          +
                          Variable: int rl_ignore_completion_duplicates
                          +

                          If non-zero, then Readline removes duplicates in the set of possible +completions. 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, +

                          +
                          Variable: int rl_filename_completion_desired
                          +

                          A non-zero value means that Readline should treat the results of the +matches 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 +within an application-specific completion function. +If it is set to a +non-zero value by such a function, Readline +appends a slash to directory names +and 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
                          +

                          A non-zero value means that Readline should quote the results of the +matches 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. +The quoting is performed via a call to the function pointed to +by rl_filename_quoting_function. +

                          + +
                          +
                          Variable: int rl_full_quoting_desired
                          +

                          A non-zero value means that Readline should apply filename-style quoting, +including any application-specified quoting mechanism, +to all completion matches even if it is not otherwise treating the +matches as filenames. +This is always zero when completion is attempted, +and can only be changed within an +application-specific completion function. +The quoting is performed via a call to the function pointed to +by rl_filename_quoting_function.

                          -
                          -
                          Variable: int rl_attempted_completion_over
                          +
                          +
                          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 +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
                          +
                          +
                          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 +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. +rl_ignore_completion_duplicates, will attempt to remove +duplicate matches.

                          -
                          -
                          Variable: int rl_completion_type
                          +
                          +
                          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(). +attempting; see the description of rl_complete_internal() +(see Completion Functions) for the list of characters. +This is set to the appropriate value before calling +any application-specific completion function, +so these functions can present +the same interface as rl_complete().

                          -
                          -
                          Variable: int rl_completion_invoking_key
                          +
                          +
                          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. +completion functions that call rl_complete_internal(). +This is set to the appropriate value before calling +any application-specific completion function.

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

                          +
                          Variable: int rl_inhibit_completion
                          +

                          If this variable is non-zero, Readline does not perform completion, +even if a key binding indicates it should. +The completion character +is inserted as if it were bound to self-insert.


                          -
                          -
                          +
                          + -

                          2.6.4 A Short Completion Example

                          +

                          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
                          +library.
                          +It is called fileman, and the source code resides in
                          +examples/fileman.c.
                          +This sample application provides
                          +command name completion, 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. */
                           
                          @@ -4842,8 +5258,8 @@ COMMAND commands[] = {
                           };
                           
                           /* Forward declarations. */
                          -char *stripwhite ();
                          -COMMAND *find_command ();
                          +char *stripwhite (char *);
                          +COMMAND *find_command (char *);
                           
                           /* The name of this program, as taken from argv[0]. */
                           char *progname;
                          @@ -4852,8 +5268,7 @@ char *progname;
                           int done;
                           
                           char *
                          -dupstr (s)
                          -     char *s;
                          +dupstr (char *s)
                           {
                             char *r;
                           
                          @@ -4862,9 +5277,8 @@ dupstr (s)
                             return (r);
                           }
                           
                          -main (argc, argv)
                          -     int argc;
                          -     char **argv;
                          +int
                          +main (int argc, char **argv)
                           {
                             char *line, *s;
                           
                          @@ -4900,8 +5314,7 @@ main (argc, argv)
                           
                           /* Execute a command line. */
                           int
                          -execute_line (line)
                          -     char *line;
                          +execute_line (char *line)
                           {
                             register int i;
                             COMMAND *command;
                          @@ -4940,8 +5353,7 @@ execute_line (line)
                           /* 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;
                          +find_command (char *name)
                           {
                             register int i;
                           
                          @@ -4955,8 +5367,7 @@ find_command (name)
                           /* Strip whitespace from the start and end of STRING.  Return a pointer
                              into STRING. */
                           char *
                          -stripwhite (string)
                          -     char *string;
                          +stripwhite (char *string)
                           {
                             register char *s, *t;
                           
                          @@ -4980,13 +5391,14 @@ stripwhite (string)
                           /*                                                                  */
                           /* **************************************************************** */
                           
                          -char *command_generator PARAMS((const char *, int));
                          -char **fileman_completion PARAMS((const char *, int, int));
                          +char *command_generator (const char *, int);
                          +char **fileman_completion (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 ()
                          +void
                          +initialize_readline (void)
                           {
                             /* Allow conditional parsing of the ~/.inputrc file. */
                             rl_readline_name = "FileMan";
                          @@ -5001,9 +5413,7 @@ initialize_readline ()
                              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;
                          +fileman_completion (const char *text, int start, int end)
                           {
                             char **matches;
                           
                          @@ -5022,9 +5432,7 @@ fileman_completion (text, start, end)
                              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;
                          +command_generator (const char *text, int state)
                           {
                             static int list_index, len;
                             char *name;
                          @@ -5062,40 +5470,40 @@ command_generator (text, state)
                           static char syscom[1024];
                           
                           /* List the file(s) named in arg. */
                          -com_list (arg)
                          -     char *arg;
                          +int
                          +com_list (char *arg)
                           {
                             if (!arg)
                               arg = "";
                           
                          -  sprintf (syscom, "ls -FClg %s", arg);
                          +  snprintf (syscom, sizeof (syscom), "ls -FClg %s", arg);
                             return (system (syscom));
                           }
                           
                          -com_view (arg)
                          -     char *arg;
                          +int
                          +com_view (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);
                          +  snprintf (syscom, sizeof (syscom), "less %s", arg);
                           #else
                          -  sprintf (syscom, "more %s", arg);
                          +  snprintf (syscom, sizeof (syscom), "more %s", arg);
                           #endif
                             return (system (syscom));
                           }
                           
                          -com_rename (arg)
                          -     char *arg;
                          +int
                          +com_rename (char *arg)
                           {
                             too_dangerous ("rename");
                             return (1);
                           }
                           
                          -com_stat (arg)
                          -     char *arg;
                          +int
                          +com_stat (char *arg)
                           {
                             struct stat finfo;
                           
                          @@ -5122,8 +5530,8 @@ com_stat (arg)
                             return (0);
                           }
                           
                          -com_delete (arg)
                          -     char *arg;
                          +int
                          +com_delete (char *arg)
                           {
                             too_dangerous ("delete");
                             return (1);
                          @@ -5131,8 +5539,8 @@ com_delete (arg)
                           
                           /* Print out help for ARG, or for all of the commands if ARG is
                              not present. */
                          -com_help (arg)
                          -     char *arg;
                          +int
                          +com_help (char *arg)
                           {
                             register int i;
                             int printed = 0;
                          @@ -5170,8 +5578,8 @@ com_help (arg)
                           }
                           
                           /* Change to the directory ARG. */
                          -com_cd (arg)
                          -     char *arg;
                          +int
                          +com_cd (char *arg)
                           {
                             if (chdir (arg) == -1)
                               {
                          @@ -5184,8 +5592,8 @@ com_cd (arg)
                           }
                           
                           /* Print out the current working directory. */
                          -com_pwd (ignore)
                          -     char *ignore;
                          +int
                          +com_pwd (char *ignore)
                           {
                             char dir[1024], *s;
                           
                          @@ -5201,16 +5609,16 @@ com_pwd (ignore)
                           }
                           
                           /* The user wishes to quit using this program.  Just set DONE non-zero. */
                          -com_quit (arg)
                          -     char *arg;
                          +int
                          +com_quit (char *arg)
                           {
                             done = 1;
                             return (0);
                           }
                           
                           /* Function which tells you that you can't do this. */
                          -too_dangerous (caller)
                          -     char *caller;
                          +void
                          +too_dangerous (char *caller)
                           {
                             fprintf (stderr,
                                      "%s: Too dangerous for me to distribute.  Write it yourself.\n",
                          @@ -5220,8 +5628,7 @@ too_dangerous (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;
                          +valid_argument (char *caller, char *arg)
                           {
                             if (!arg || !*arg)
                               {
                          @@ -5237,29 +5644,29 @@ valid_argument (caller, arg)
                           
                          -
                          -
                          +
                          + -

                          Appendix A GNU Free Documentation License

                          +

                          Appendix A GNU Free Documentation License

                          -
                          Version 1.3, 3 November 2008 +
                          Version 1.3, 3 November 2008
                          -
                          Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
                          -http://fsf.org/
                          +
                          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 +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 @@ -5333,16 +5740,16 @@ 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 +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, @@ -5431,7 +5838,7 @@ 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 @@ -5631,7 +6038,7 @@ not give you any rights to use it. 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/. +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 @@ -5677,30 +6084,30 @@ provided the MMC is eligible for relicensing.

                                -

                                ADDENDUM: How to use this License for your documents

                                +

                                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.
                                +
                                +
                                  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.
                          -
                          +
                          +
                              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 @@ -5715,567 +6122,580 @@ to permit their use in free software.


                          -
                          -
                          +
                          + -

                          Concept Index

                          -
                          Jump to:   A +

                          Concept Index

                          +
                          +
                          Jump to:   A   -C +C   -E +E   -I +I   -K +K   -N +N   -R +R   -V +V   -Y +Y  
                          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
                          Index Entry  Section

                          A
                          application-specific completion functions: Custom Completers

                          C
                          command editing: Readline Bare Essentials

                          E
                          editing command lines: Readline Bare Essentials

                          I
                          initialization file, readline: Readline Init File
                          interaction, readline: Readline Interaction

                          K
                          kill ring: Readline Killing Commands
                          killing text: Readline Killing Commands

                          N
                          notation, readline: Readline Bare Essentials

                          R
                          readline, function: Basic Behavior

                          V
                          variables, readline: Readline Init File Syntax

                          Y
                          yanking text: Readline Killing Commands

                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          Index EntrySection

                          A
                          application-specific completion functionsCustom Completers

                          C
                          command editingReadline Bare Essentials

                          E
                          editing command linesReadline Bare Essentials

                          I
                          initialization file, readlineReadline Init File
                          interaction, readlineReadline Interaction

                          K
                          kill ringReadline Killing Commands
                          killing textReadline Killing Commands

                          N
                          notation, readlineReadline Bare Essentials

                          R
                          readline, functionBasic Behavior

                          V
                          variables, readlineReadline Init File Syntax

                          Y
                          yanking textReadline Killing Commands

                          -
                          Jump to:   A + +
                          -
                          -
                          +
                          + -

                          Function and Variable Index

                          -
                          Jump to:   _ +

                          Function and Variable Index

                          +
                          +
                          Jump to:   _  
                          -A +A   -B +B   -C +C   -D +D   -E +E   -F +F   -H +H   -I +I   -K +K   -M +M   -N +N   -O +O   -P +P   -Q +Q   -R +R   -S +S   -T +T   -U +U   -V +V   -Y +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

                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          Index EntrySection

                          _
                          _rl_digit_pUtility Functions
                          _rl_digit_valueUtility Functions
                          _rl_lowercase_pUtility Functions
                          _rl_to_lowerUtility Functions
                          _rl_to_upperUtility Functions
                          _rl_uppercase_pUtility Functions

                          A
                          abort (C-g)Miscellaneous Commands
                          accept-line (Newline or Return)Commands For History
                          active-region-end-colorReadline Init File Syntax
                          active-region-start-colorReadline 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-styleReadline Init File Syntax
                          bind-tty-special-charsReadline Init File Syntax
                          blink-matching-parenReadline 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-prefixReadline Init File Syntax
                          colored-statsReadline Init File Syntax
                          comment-beginReadline Init File Syntax
                          complete (TAB)Commands For Completion
                          completion-display-widthReadline Init File Syntax
                          completion-ignore-caseReadline Init File Syntax
                          completion-map-caseReadline Init File Syntax
                          completion-prefix-display-lengthReadline Init File Syntax
                          completion-query-itemsReadline Init File Syntax
                          convert-metaReadline 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-completionReadline 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-charactersReadline Init File Syntax
                          editing-modeReadline Init File Syntax
                          emacs-editing-mode (C-e)Miscellaneous Commands
                          emacs-mode-stringReadline Init File Syntax
                          enable-active-region TheReadline Init File Syntax
                          enable-bracketed-pasteReadline Init File Syntax
                          enable-keypadReadline Init File Syntax
                          enable-meta-keyReadline 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
                          execute-named-command (M-x)Miscellaneous Commands
                          expand-tildeReadline Init File Syntax
                          export-completions ()Commands For Completion

                          F
                          fetch-history ()Commands For History
                          force-meta-prefixReadline Init File Syntax
                          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-pointReadline Init File Syntax
                          history-search-backward ()Commands For History
                          history-search-forward ()Commands For History
                          history-sizeReadline Init File Syntax
                          history-substring-search-backward ()Commands For History
                          history-substring-search-forward ()Commands For History
                          horizontal-scroll-modeReadline Init File Syntax

                          I
                          input-metaReadline Init File Syntax
                          insert-comment (M-#)Miscellaneous Commands
                          insert-completions (M-*)Commands For Completion
                          isearch-terminatorsReadline Init File Syntax

                          K
                          keymapReadline 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-linesReadline Init File Syntax
                          mark-symlinked-directoriesReadline Init File Syntax
                          match-hidden-filesReadline Init File Syntax
                          menu-complete ()Commands For Completion
                          menu-complete-backward ()Commands For Completion
                          menu-complete-display-prefixReadline Init File Syntax
                          meta-flagReadline 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-metaReadline Init File Syntax
                          overwrite-mode ()Commands For Text

                          P
                          page-completionsReadline 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
                          readlineBasic Behavior
                          redraw-current-line ()Commands For Moving
                          reverse-search-history (C-r)Commands For History
                          revert-all-at-newlineReadline Init File Syntax
                          revert-line (M-r)Miscellaneous Commands
                          rl_activate_markMiscellaneous Functions
                          rl_add_defunFunction Naming
                          rl_add_funmap_entryAssociating Function Names and Bindings
                          rl_add_undoAllowing Undoing
                          rl_alphabeticUtility Functions
                          rl_already_promptedReadline Variables
                          rl_attempted_completion_functionCompletion Variables
                          rl_attempted_completion_overCompletion Variables
                          rl_basic_quote_charactersCompletion Variables
                          rl_basic_word_break_charactersCompletion Variables
                          rl_begin_undo_groupAllowing Undoing
                          rl_bind_keyBinding Keys
                          rl_bind_key_if_unboundBinding Keys
                          rl_bind_key_if_unbound_in_mapBinding Keys
                          rl_bind_key_in_mapBinding Keys
                          rl_bind_keyseqBinding Keys
                          rl_bind_keyseq_if_unboundBinding Keys
                          rl_bind_keyseq_if_unbound_in_mapBinding Keys
                          rl_bind_keyseq_in_mapBinding Keys
                          rl_binding_keymapReadline Variables
                          rl_callback_handler_installAlternate Interface
                          rl_callback_handler_removeAlternate Interface
                          rl_callback_read_charAlternate Interface
                          rl_callback_sigcleanupAlternate Interface
                          rl_catch_signalsReadline Signal Handling
                          rl_catch_sigwinchReadline Signal Handling
                          rl_change_environmentReadline Signal Handling
                          rl_char_is_quoted_pCompletion Variables
                          rl_check_signalsReadline Signal Handling
                          rl_cleanup_after_signalReadline Signal Handling
                          rl_clear_historyMiscellaneous Functions
                          rl_clear_messageRedisplay
                          rl_clear_pending_inputCharacter Input
                          rl_clear_signalsReadline Signal Handling
                          rl_clear_visible_lineRedisplay
                          rl_completeHow Completing Works
                          rl_completeCompletion Functions
                          rl_complete_internalCompletion Functions
                          rl_completer_quote_charactersCompletion Variables
                          rl_completer_word_break_charactersCompletion Variables
                          rl_completion_append_characterCompletion Variables
                          rl_completion_display_matches_hookCompletion Variables
                          rl_completion_entry_functionHow Completing Works
                          rl_completion_entry_functionCompletion Variables
                          rl_completion_found_quoteCompletion Variables
                          rl_completion_invoking_keyCompletion Variables
                          rl_completion_mark_symlink_dirsCompletion Variables
                          rl_completion_matchesCompletion Functions
                          rl_completion_modeCompletion Functions
                          rl_completion_query_itemsCompletion Variables
                          rl_completion_quote_characterCompletion Variables
                          rl_completion_rewrite_hookCompletion Variables
                          rl_completion_suppress_appendCompletion Variables
                          rl_completion_suppress_quoteCompletion Variables
                          rl_completion_typeCompletion Variables
                          rl_completion_word_break_hookCompletion Variables
                          rl_copy_keymapKeymaps
                          rl_copy_textModifying Text
                          rl_crlfRedisplay
                          rl_deactivate_markMiscellaneous Functions
                          rl_delete_textModifying Text
                          rl_deprep_term_functionReadline Variables
                          rl_deprep_terminalTerminal Management
                          rl_dingUtility Functions
                          rl_directory_completion_hookCompletion Variables
                          rl_directory_rewrite_hook;Completion Variables
                          rl_discard_keymapKeymaps
                          rl_dispatchingReadline Variables
                          rl_display_match_listUtility Functions
                          rl_display_promptReadline Variables
                          rl_do_undoAllowing Undoing
                          rl_doneReadline Variables
                          rl_echo_signal_charReadline Signal Handling
                          rl_editing_modeReadline Variables
                          rl_empty_keymapKeymaps
                          rl_endReadline Variables
                          rl_end_undo_groupAllowing Undoing
                          rl_eof_foundReadline Variables
                          rl_erase_empty_lineReadline Variables
                          rl_event_hookReadline Variables
                          rl_execute_nextCharacter Input
                          rl_executing_keyReadline Variables
                          rl_executing_keymapReadline Variables
                          rl_executing_keyseqReadline Variables
                          rl_executing_macroReadline Variables
                          rl_expand_promptRedisplay
                          rl_explicit_argReadline Variables
                          rl_extend_line_bufferUtility Functions
                          rl_filename_completion_desiredCompletion Variables
                          rl_filename_completion_functionCompletion Functions
                          rl_filename_dequoting_functionCompletion Variables
                          rl_filename_quote_charactersCompletion Variables
                          rl_filename_quoting_desiredCompletion Variables
                          rl_filename_quoting_functionCompletion Variables
                          rl_filename_rewrite_hookCompletion Variables
                          rl_filename_stat_hookCompletion Variables
                          rl_forced_update_displayRedisplay
                          rl_freeUtility Functions
                          rl_free_keymapKeymaps
                          rl_free_line_stateReadline Signal Handling
                          rl_free_undo_listAllowing Undoing
                          rl_full_quoting_desiredCompletion Variables
                          rl_function_dumperAssociating Function Names and Bindings
                          rl_function_of_keyseqAssociating Function Names and Bindings
                          rl_function_of_keyseq_lenAssociating Function Names and Bindings
                          rl_funmap_namesAssociating Function Names and Bindings
                          rl_generic_bindBinding Keys
                          rl_get_keymapKeymaps
                          rl_get_keymap_by_nameKeymaps
                          rl_get_keymap_nameKeymaps
                          rl_get_screen_sizeReadline Signal Handling
                          rl_get_termcapMiscellaneous Functions
                          rl_getcCharacter Input
                          rl_getc_functionReadline Variables
                          rl_gnu_readline_pReadline Variables
                          rl_ignore_completion_duplicatesCompletion Variables
                          rl_ignore_some_completions_functionCompletion Variables
                          rl_inhibit_completionCompletion Variables
                          rl_initializeUtility Functions
                          rl_input_available_hookReadline Variables
                          rl_insert_completionsCompletion Functions
                          rl_insert_textModifying Text
                          rl_instreamReadline Variables
                          rl_invoking_keyseqsAssociating Function Names and Bindings
                          rl_invoking_keyseqs_in_mapAssociating Function Names and Bindings
                          rl_keep_mark_activeMiscellaneous Functions
                          rl_key_sequence_lengthReadline Variables
                          rl_kill_textModifying Text
                          rl_last_funcReadline Variables
                          rl_library_versionReadline Variables
                          rl_line_bufferReadline Variables
                          rl_list_funmap_namesAssociating Function Names and Bindings
                          rl_macro_bindMiscellaneous Functions
                          rl_macro_display_hookReadline Variables
                          rl_macro_dumperMiscellaneous Functions
                          rl_make_bare_keymapKeymaps
                          rl_make_keymapKeymaps
                          rl_markReadline Variables
                          rl_mark_active_pMiscellaneous Functions
                          rl_messageRedisplay
                          rl_modifyingAllowing Undoing
                          rl_named_functionAssociating Function Names and Bindings
                          rl_num_chars_to_readReadline Variables
                          rl_numeric_argReadline Variables
                          rl_on_new_lineRedisplay
                          rl_on_new_line_with_promptRedisplay
                          rl_outstreamReadline Variables
                          rl_parse_and_bindBinding Keys
                          rl_pending_inputReadline Variables
                          rl_pending_signalReadline Signal Handling
                          rl_persistent_signal_handlersReadline Signal Handling
                          rl_pointReadline Variables
                          rl_possible_completionsCompletion Functions
                          rl_pre_input_hookReadline Variables
                          rl_prefer_env_winsizeReadline Variables
                          rl_prep_term_functionReadline Variables
                          rl_prep_terminalTerminal Management
                          rl_print_keybindingAssociating Function Names and Bindings
                          rl_promptReadline Variables
                          rl_push_macro_inputModifying Text
                          rl_read_init_fileBinding Keys
                          rl_read_keyCharacter Input
                          rl_readline_nameReadline Variables
                          rl_readline_stateReadline Variables
                          rl_readline_versionReadline Variables
                          rl_redisplayRedisplay
                          rl_redisplay_functionReadline Variables
                          rl_reparse_colorsMiscellaneous Functions
                          rl_replace_lineModifying Text
                          rl_reset_after_signalReadline Signal Handling
                          rl_reset_line_stateRedisplay
                          rl_reset_screen_sizeReadline Signal Handling
                          rl_reset_terminalTerminal Management
                          rl_resize_terminalReadline Signal Handling
                          rl_restore_promptRedisplay
                          rl_restore_stateUtility Functions
                          rl_save_promptRedisplay
                          rl_save_stateUtility Functions
                          rl_set_keyBinding Keys
                          rl_set_keyboard_input_timeoutCharacter Input
                          rl_set_keymapKeymaps
                          rl_set_keymap_nameKeymaps
                          rl_set_paren_blink_timeoutMiscellaneous Functions
                          rl_set_promptRedisplay
                          rl_set_screen_sizeReadline Signal Handling
                          rl_set_signalsReadline Signal Handling
                          rl_set_timeoutCharacter Input
                          rl_show_charRedisplay
                          rl_signal_event_hookReadline Variables
                          rl_sort_completion_matchesCompletion Variables
                          rl_special_prefixesCompletion Variables
                          rl_startup_hookReadline Variables
                          rl_stuff_charCharacter Input
                          rl_terminal_nameReadline Variables
                          rl_timeout_event_hookReadline Variables
                          rl_timeout_remainingCharacter Input
                          rl_trim_arg_from_keyseqAssociating Function Names and Bindings
                          rl_tty_set_default_bindingsTerminal Management
                          rl_tty_set_echoingTerminal Management
                          rl_tty_unset_default_bindingsTerminal Management
                          rl_unbind_command_in_mapBinding Keys
                          rl_unbind_function_in_mapBinding Keys
                          rl_unbind_keyBinding Keys
                          rl_unbind_key_in_mapBinding Keys
                          rl_username_completion_functionCompletion Functions
                          rl_variable_bindMiscellaneous Functions
                          rl_variable_dumperMiscellaneous Functions
                          rl_variable_valueMiscellaneous Functions

                          S
                          search-ignore-caseReadline Init File Syntax
                          self-insert (a, b, A, 1, !, …)Commands For Text
                          set-mark (C-@)Miscellaneous Commands
                          show-all-if-ambiguousReadline Init File Syntax
                          show-all-if-unmodifiedReadline Init File Syntax
                          show-mode-in-promptReadline Init File Syntax
                          skip-completed-textReadline 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-stringReadline Init File Syntax
                          vi-editing-mode (M-C-j)Miscellaneous Commands
                          vi-ins-mode-stringReadline Init File Syntax
                          visible-statsReadline 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:   _ + + diff --git a/doc/readline.info b/doc/readline.info index 4ea6b8c..33b4b45 100644 --- a/doc/readline.info +++ b/doc/readline.info @@ -1,11 +1,10 @@ -This is readline.info, produced by makeinfo version 6.8 from rlman.texi. +This is readline.info, produced by makeinfo version 7.1 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. +This manual describes the GNU Readline Library (version 8.3, 30 December +2024), 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. + Copyright © 1988-2025 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, @@ -64,33 +63,46 @@ File: readline.info, Node: Introduction and Notation, Next: Readline Interacti 1.1 Introduction to Line Editing ================================ -The following paragraphs describe the notation used to represent -keystrokes. +The following paragraphs use Emacs style to describe the notation used +to represent keystrokes. - The text 'C-k' is read as 'Control-K' and describes the character + 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 + 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 +key is pressed (a “meta character”), then both are released. The Meta +key is labeled or