From 7180591ac5d19b95b0a424feb56d7fd41c231966 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 2 May 2011 16:17:50 +0200 Subject: [PATCH] Bundle readline-6.2 with a workaround of skipped "ask" (BZ 701131). Use --without-system-readline, disable Requires and BuildRequires of readline. Drop gdb-6.5-readline-long-line-crash.patch and gdb-readline-6.0-signal.patch. --- gdb-6.5-readline-long-line-crash.patch | 165 - gdb-bz701131-readline62-1of3.patch | 20944 +++++++++++++++++++++++ gdb-bz701131-readline62-2of3.patch | 231 + gdb-bz701131-readline62-3of3.patch | 117 + gdb-readline-6.0-signal.patch | 266 - gdb.spec | 34 +- 6 files changed, 21310 insertions(+), 447 deletions(-) delete mode 100644 gdb-6.5-readline-long-line-crash.patch create mode 100644 gdb-bz701131-readline62-1of3.patch create mode 100644 gdb-bz701131-readline62-2of3.patch create mode 100644 gdb-bz701131-readline62-3of3.patch delete mode 100644 gdb-readline-6.0-signal.patch diff --git a/gdb-6.5-readline-long-line-crash.patch b/gdb-6.5-readline-long-line-crash.patch deleted file mode 100644 index cc76179..0000000 --- a/gdb-6.5-readline-long-line-crash.patch +++ /dev/null @@ -1,165 +0,0 @@ -Fix Valgrind paste of >= 256 * (screen width) characters (as 130001). - -Invalid write of size 4 - at 0x8203BD9: rl_redisplay (display.c:812) - by 0x81F5130: _rl_internal_char_cleanup (readline.c:427) - by 0x81F52B3: readline_internal_char (readline.c:508) - by 0x8209817: rl_callback_read_char (callback.c:184) - by 0x8135312: rl_callback_read_char_wrapper (event-top.c:179) - by 0x8135B7B: stdin_event_handler (event-top.c:432) - by 0x81349F2: handle_file_event (event-loop.c:730) - by 0x81342AB: process_event (event-loop.c:343) - by 0x81342F4: gdb_do_one_event (event-loop.c:380) - by 0x81313AC: catch_errors (exceptions.c:515) - by 0x80CE8CA: tui_command_loop (tui-interp.c:151) - by 0x81318B9: current_interp_command_loop (interps.c:278) - Address 0x43DCEB8 is 0 bytes after a block of size 1,024 alloc'd - at 0x4005400: malloc (vg_replace_malloc.c:149) - by 0x8087084: xmalloc (utils.c:959) - by 0x8202CA7: init_line_structures (display.c:440) - by 0x8202D14: rl_redisplay (display.c:471) - by 0x81F4F53: readline_internal_setup (readline.c:363) - by 0x820958C: _rl_callback_newline (callback.c:89) - by 0x82095BB: rl_callback_handler_install (callback.c:101) - by 0x80CE896: tui_command_loop (tui-interp.c:138) - by 0x81318B9: current_interp_command_loop (interps.c:278) - by 0x807E69A: captured_command_loop (main.c:101) - by 0x81313AC: catch_errors (exceptions.c:515) - by 0x807F55A: captured_main (main.c:826) - - -2006-11-08 Jan Kratochvil - - * readline/display.c (line_state, line_state_array, line_state_visible, - line_state_invisible): Encapsulate _rl_wrapped_line, inv_lbreaks, - inv_lbsize, vis_lbreaks, vis_lbsize, visible_line, invisible_line. - (init_line_structures): Initialize both _rl_wrapped_line ones now. - (rl_redisplay): Fix _rl_wrapped_line handling by using its own size. - Swap whole `line_state_visible' / `line_state_invisible' structures. - (update_line): Update for new `_rl_wrapped_line'. - - -Index: ./readline/display.c -=================================================================== ---- ./readline/display.c 5 May 2006 18:26:12 -0000 1.11 -+++ ./readline/display.c 8 Nov 2006 18:23:33 -0000 -@@ -73,15 +73,31 @@ static void delete_chars PARAMS((int)); - static void insert_some_chars PARAMS((char *, int, int)); - static void cr PARAMS((void)); - -+struct line_state -+ { -+ char *line; -+ int *lbreaks; -+ int lbreaks_size; -+#if defined (HANDLE_MULTIBYTE) -+ int *wrapped_line; -+ int wrapped_line_size; -+#endif -+ }; -+static struct line_state line_state_array[2]; -+static struct line_state *line_state_visible = &line_state_array[0]; -+static struct line_state *line_state_invisible = &line_state_array[1]; -+ - #if defined (HANDLE_MULTIBYTE) - static int _rl_col_width PARAMS((const char *, int, int)); --static int *_rl_wrapped_line; - #else - # define _rl_col_width(l, s, e) (((e) <= (s)) ? 0 : (e) - (s)) - #endif - --static int *inv_lbreaks, *vis_lbreaks; --static int inv_lbsize, vis_lbsize; -+/* FIXME: Backward compatible naming. */ -+#define inv_lbreaks (line_state_invisible->lbreaks) -+#define inv_lbsize (line_state_invisible->lbreaks_size) -+#define vis_lbreaks (line_state_visible->lbreaks) -+#define vis_lbsize (line_state_visible->lbreaks_size) - - /* Heuristic used to decide whether it is faster to move from CUR to NEW - by backing up or outputting a carriage return and moving forward. */ -@@ -150,8 +166,9 @@ static int last_lmargin; - - /* The line display buffers. One is the line currently displayed on - the screen. The other is the line about to be displayed. */ --static char *visible_line = (char *)NULL; --static char *invisible_line = (char *)NULL; -+/* FIXME: Backward compatible naming. */ -+#define visible_line (line_state_visible->line) -+#define invisible_line (line_state_invisible->line) - - /* A buffer for `modeline' messages. */ - static char msg_buf[128]; -@@ -437,7 +454,10 @@ init_line_structures (minsize) - inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int)); - vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int)); - #if defined (HANDLE_MULTIBYTE) -- _rl_wrapped_line = (int *)xmalloc (vis_lbsize * sizeof (int)); -+ line_state_visible->wrapped_line_size = vis_lbsize; -+ line_state_visible->wrapped_line = (int *)xmalloc (line_state_visible->wrapped_line_size * sizeof (int)); -+ line_state_invisible->wrapped_line_size = inv_lbsize; -+ line_state_invisible->wrapped_line = (int *)xmalloc (line_state_invisible->wrapped_line_size * sizeof (int)); - #endif - inv_lbreaks[0] = vis_lbreaks[0] = 0; - } -@@ -572,10 +592,15 @@ rl_redisplay () - { \ - inv_lbsize *= 2; \ - inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ -- _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \ - } \ - inv_lbreaks[++newlines] = out; \ -- _rl_wrapped_line[newlines] = _rl_wrapped_multicolumn; \ -+ if (newlines >= (line_state_invisible->wrapped_line_size - 1)) \ -+ { \ -+ line_state_invisible->wrapped_line_size *= 2; \ -+ line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, \ -+ line_state_invisible->wrapped_line_size * sizeof (int)); \ -+ } \ -+ line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; \ - lpos = 0; \ - } \ - } while (0) -@@ -605,7 +630,7 @@ rl_redisplay () - #endif - - #if defined (HANDLE_MULTIBYTE) -- memset (_rl_wrapped_line, 0, vis_lbsize); -+ memset (line_state_invisible->wrapped_line, 0, line_state_invisible->wrapped_line_size * sizeof (int)); - num = 0; - #endif - -@@ -1118,17 +1143,10 @@ rl_redisplay () - - /* Swap visible and non-visible lines. */ - { -- char *vtemp = visible_line; -- int *itemp = vis_lbreaks, ntemp = vis_lbsize; -- -- visible_line = invisible_line; -- invisible_line = vtemp; -- -- vis_lbreaks = inv_lbreaks; -- inv_lbreaks = itemp; -- -- vis_lbsize = inv_lbsize; -- inv_lbsize = ntemp; -+ struct line_state *line_state_temp = line_state_visible; -+ -+ line_state_visible = line_state_invisible; -+ line_state_invisible = line_state_temp; - - rl_display_fixed = 0; - /* If we are displaying on a single line, and last_lmargin is > 0, we -@@ -1194,8 +1212,9 @@ update_line (old, new, current_line, oma - /* This fixes only double-column characters, but if the wrapped - character comsumes more than three columns, spaces will be - inserted in the string buffer. */ -- if (_rl_wrapped_line[current_line] > 0) -- _rl_clear_to_eol (_rl_wrapped_line[current_line]); -+ if (current_line < line_state_visible->wrapped_line_size -+ && line_state_visible->wrapped_line[current_line] > 0) -+ _rl_clear_to_eol (line_state_visible->wrapped_line[current_line]); - - memset (&ps, 0, sizeof (mbstate_t)); - ret = mbrtowc (&wc, new, MB_CUR_MAX, &ps); diff --git a/gdb-bz701131-readline62-1of3.patch b/gdb-bz701131-readline62-1of3.patch new file mode 100644 index 0000000..e93ebe3 --- /dev/null +++ b/gdb-bz701131-readline62-1of3.patch @@ -0,0 +1,20944 @@ +archer-jankratochvil-readline62 +b13706abbee9646f4de522c0552ddd68d1a4f43a + +--- a/gdb/config.in ++++ b/gdb/config.in +@@ -947,9 +947,6 @@ + /* Define to `int' if does not define. */ + #undef pid_t + +-/* readline-6.0 started to use different name. */ +-#undef readline_echoing_p +- + /* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +--- a/gdb/configure ++++ b/gdb/configure +@@ -9743,39 +9743,6 @@ if test "$with_system_readline" = yes; then + READLINE_DEPS= + READLINE_CFLAGS= + READLINE_TEXI_INCFLAG= +- +- # readline-6.0 started to use the name `_rl_echoing_p'. +- # `$(READLINE_DIR)/' of bundled readline would not resolve in configure. +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline_echoing_p" >&5 +-$as_echo_n "checking for readline_echoing_p... " >&6; } +- save_LIBS=$LIBS +- LIBS="$LIBS $READLINE" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +-extern int readline_echoing_p; +- return readline_echoing_p; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- READLINE_ECHOING_P=yes +-else +- READLINE_ECHOING_P=no +- +-$as_echo "#define readline_echoing_p _rl_echoing_p" >>confdefs.h +- +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LIBS="$save_LIBS" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_ECHOING_P" >&5 +-$as_echo "$READLINE_ECHOING_P" >&6; } + else + READLINE='$(READLINE_DIR)/libreadline.a' + READLINE_DEPS='$(READLINE)' +--- a/gdb/configure.ac ++++ b/gdb/configure.ac +@@ -539,21 +539,6 @@ if test "$with_system_readline" = yes; then + READLINE_DEPS= + READLINE_CFLAGS= + READLINE_TEXI_INCFLAG= +- +- # readline-6.0 started to use the name `_rl_echoing_p'. +- # `$(READLINE_DIR)/' of bundled readline would not resolve in configure. +- +- AC_MSG_CHECKING([for readline_echoing_p]) +- save_LIBS=$LIBS +- LIBS="$LIBS $READLINE" +- AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int readline_echoing_p; +- return readline_echoing_p;]]), +- [READLINE_ECHOING_P=yes], +- [READLINE_ECHOING_P=no +- AC_DEFINE([readline_echoing_p], [_rl_echoing_p], +- [readline-6.0 started to use different name.])]) +- LIBS="$save_LIBS" +- AC_MSG_RESULT([$READLINE_ECHOING_P]) + else + READLINE='$(READLINE_DIR)/libreadline.a' + READLINE_DEPS='$(READLINE)' +--- a/gdb/tui/tui-io.c ++++ b/gdb/tui/tui-io.c +@@ -133,7 +133,7 @@ static Function *tui_old_rl_getc_function; + static VFunction *tui_old_rl_redisplay_function; + static VFunction *tui_old_rl_prep_terminal; + static VFunction *tui_old_rl_deprep_terminal; +-static int tui_old_readline_echoing_p; ++static int tui_old_rl_echoing_p; + + /* Readline output stream. + Should be removed when readline is clean. */ +@@ -506,8 +506,8 @@ tui_rl_display_match_list (char **matches, int len, int max) + void + tui_setup_io (int mode) + { +- extern int readline_echoing_p; +- ++ extern int _rl_echoing_p; ++ + if (mode) + { + /* Redirect readline to TUI. */ +@@ -516,12 +516,12 @@ tui_setup_io (int mode) + tui_old_rl_prep_terminal = rl_prep_term_function; + tui_old_rl_getc_function = rl_getc_function; + tui_old_rl_outstream = rl_outstream; +- tui_old_readline_echoing_p = readline_echoing_p; ++ tui_old_rl_echoing_p = _rl_echoing_p; + rl_redisplay_function = tui_redisplay_readline; + rl_deprep_term_function = tui_deprep_terminal; + rl_prep_term_function = tui_prep_terminal; + rl_getc_function = tui_getc; +- readline_echoing_p = 0; ++ _rl_echoing_p = 0; + rl_outstream = tui_rl_outstream; + rl_prompt = 0; + rl_completion_display_matches_hook = tui_rl_display_match_list; +@@ -560,7 +560,7 @@ tui_setup_io (int mode) + rl_getc_function = tui_old_rl_getc_function; + rl_outstream = tui_old_rl_outstream; + rl_completion_display_matches_hook = 0; +- readline_echoing_p = tui_old_readline_echoing_p; ++ _rl_echoing_p = tui_old_rl_echoing_p; + rl_already_prompted = 0; + + /* Save tty for SIGCONT. */ +--- a/readline/CHANGELOG ++++ b/readline/CHANGELOG +@@ -918,3 +918,178 @@ configure.in + - changed release status to `release' + + [readline-5.1 frozen] ++ ++ 12/9 ++ ---- ++[readline-5.1 released] ++ ++ 12/14 ++ ----- ++examples/rlfe/Makefile.in ++ - add @LIBS@ to LIBS assignment to pick up extra libraries from ++ configure ++ ++ 1/3/2006 ++ -------- ++support/shlib-install ++ - Install shared libraries with execute bit set on Linux ++ ++ 6/9 ++ --- ++[readline-5.2-alpha frozen] ++ ++ 6/26 ++ ---- ++configure.in ++ - set CROSS_COMPILE to the empty string by default, so we don't inherit ++ a random value from the environment ++ ++ 7/8 ++ --- ++[readline-5.2-alpha released] ++ ++ ++[readline-5.2-beta released] ++ ++ 9/12 ++ ---- ++config.h.in ++ - add defines for wcscoll, iswctype, iswupper, iswlower, towupper, ++ towlower functions ++ - replace define for wctomb with one for wcrtomb ++ - add defines for wchar_t, wint_t, wctype_t types ++ ++ 10/11 ++ ----- ++[readline-5.2 released] ++ ++ 11/9 ++ ---- ++examples/rlfe/{configure.in,Makefile.in,config.h.in,rlfe.c,pty.c} ++ - portability fixes from Mike Frysinger ++ ++ 11/21 ++ ----- ++Makefile.in ++ - add `install-examples' and `uninstall-examples' targets ++ ++examples/Makefile.in ++ - add correct variables to build examples on Windows ++ - add appropriate rules to install and uninstall example sources in ++ $(datadir)/readline ++ ++ 11/27 ++ ----- ++config.h.in ++ - move #undef of HAVE_STRCOLL out of config.h.in, since autoconf tries ++ to substitute it based on configure tests ++ ++ 4/27/2007 ++ --------- ++examples/autoconf ++ - new directory with example autoconf macros to detect readline and ++ return information about the installed version ++ ++ 6/13 ++ ---- ++support/shlib-install ++ - changes to support AIX 5.x shared library installation ++ ++ 3/20/2008 ++ --------- ++support/shlib-install ++ - add support for NetBSD and Interix shared library installation ++ ++ 4/22 ++ ---- ++support/wcwidth.c ++ - updated implementation from 2007-05 ++ ++ 7/18 ++ ---- ++support/shlib-install ++ - support for mingw32, contributed by Carlo Bramix ++ ++ 8/4 ++ --- ++configure.in ++ - changed to readline-6.0 ++ ++ 8/18 ++ ---- ++support/config.{guess,sub} ++ - updated to newer versions from autoconf-2.62 distribution ++ ++ 3/5/2009 ++ -------- ++support/shlib-install ++ - take a new -V host_vendor argument ++ - add ${host_vendor} to string tested in case statement for symlink ++ creation section ++ - add support for FreeBSD/gentoo, which uses Linux library naming ++ scheme ++ - change FreeBSD symlink rules, since FreeBSD 7+ has only ELF shared ++ libraries. DragonflyBSD rules are the same. Fix from Timothy ++ Redaelli ++ ++shlib/Makefile.in ++ - add definition of host_vendor, substituted by configure ++ - add -V host_vendor argument to all invocations of shlib-install. ++ Fix from Timothy Redaelli ++ ++ 3/10 ++ ---- ++configure.in ++ - add call to AC_SYS_LARGEFILE for readdir and largefile support on ++ Linux ++ ++config.h.in ++ - add _FILE_OFFSET_BITS define ++ ++ 4/19 ++ ---- ++Makefile.in ++ - add targets for making and installing documentation required by GNU ++ coding standards. Fix from Joseph Myers ++ ++posixselect.h ++ - pick up from bash. Inspired by Mike Frysinger ++ ++ 10/28 ++ ----- ++support/shlib-install ++ - decrease the default version of FreeBSD that installs shared libraries ++ to 4.x. Advice from Peter Jeremy ++ ++ 12/18 ++ ----- ++[readline-6.1-rc1 released] ++ ++ 12/23 ++ ----- ++doc/Makefile.in ++ - make sure $(topdir) is not ".." before removing all of the formatted ++ documentation in `make distclean'. $(topdir) is set to `..' if ++ readline is being built in the source directory. Fixes problem ++ noticed by THOUMIN Damien ++ ++ 12/29 ++ ----- ++[readline-6.1 frozen] ++ ++ 2/5/2010 ++ -------- ++examples/Makefile.in ++ - make sure to install example C files using $(srcdir)/$$f in case ++ we're building outside the source directory. Bug report and fix ++ from Peter Breitenlohner ++ ++ 7/25 ++ ---- ++xfree.c ++ - new file with xfree() implementation, moved from xmalloc.c ++ ++ 12/28 ++ ----- ++{examples,shlib}/Makefile.in ++ - Cygwin-based changes from Eric Blake +--- a/readline/CHANGES ++++ b/readline/CHANGES +@@ -1,3 +1,320 @@ ++This document details the changes between this version, readline-6.2, ++and the previous version, readline-6.1. ++ ++1. Changes to Readline ++ ++a. Fixed a bug that caused the unconverted filename to be added to the list of ++ completions when the application specified filename conversion functions. ++ ++b. Fixed a bug that caused the wrong filename to be passed to opendir when the ++ application has specified a filename dequoting function. ++ ++c. Fixed a bug when repeating a character search in vi mode in the case where ++ there was no search to repeat. ++ ++d. When show-all-if-ambiguous is set, the completion routines no longer insert ++ a common match prefix that is shorter than the text being completed. ++ ++e. The full set of vi editing commands may now be used in callback mode. ++ ++f. Fixed a bug that caused readline to not update its idea of the terminal ++ dimensions while running in `no-echo' mode. ++ ++h. Fixed a bug that caused readline to dump core if an application called ++ rl_prep_terminal without setting rl_instream. ++ ++i. Fixed a bug that caused meta-prefixed characters bound to incremental ++ search forward or backward to not be recognized if they were typed ++ subsequently. ++ ++j. The incremental search code treats key sequences that map to the same ++ functions as (default) ^G, ^W, and ^Y as equivalent to those characters. ++ ++k. Fixed a bug in menu-complete that caused it to misbehave with large ++ negative argument. ++ ++l. Fixed a bug that caused vi-mode yank-last-arg to ring the bell when invoked ++ at the end of the line. ++ ++m. Fixed a bug that made an explicit argument of 0 to yank-last-arg behave ++ as if it were a negative argument. ++ ++n. Fixed a bug that caused directory names in words to be completed to not ++ be dequoted correctly. ++ ++2. New Features in Readline ++ ++a. The history library does not try to write the history filename in the ++ current directory if $HOME is unset. This closes a potential security ++ problem if the application does not specify a history filename. ++ ++b. New bindable variable `completion-display-width' to set the number of ++ columns used when displaying completions. ++ ++c. New bindable variable `completion-case-map' to cause case-insensitive ++ completion to treat `-' and `_' as identical. ++ ++d. There are new bindable vi-mode command names to avoid readline's case- ++ insensitive matching not allowing them to be bound separately. ++ ++e. New bindable variable `menu-complete-display-prefix' causes the menu ++ completion code to display the common prefix of the possible completions ++ before cycling through the list, instead of after. ++ ++------------------------------------------------------------------------------- ++This document details the changes between this version, readline-6.1, ++and the previous version, readline-6.0. ++ ++1. Changes to Readline ++ ++a. The SIGWINCH signal handler now avoids calling the redisplay code if ++ one arrives while in the middle of redisplay. ++ ++b. Changes to the timeout code to make sure that timeout values greater ++ than one second are handled better. ++ ++c. Fixed a bug in the redisplay code that was triggered by a prompt ++ containing invisible characters exactly the width of the screen. ++ ++d. Fixed a bug in the redisplay code encountered when running in horizontal ++ scroll mode. ++ ++e. Fixed a bug that prevented menu completion from properly completing ++ filenames. ++ ++f. Fixed a redisplay bug caused by a multibyte character causing a line to ++ wrap. ++ ++g. Fixed a bug that caused key sequences of two characters to not be ++ recognized when a longer sequence identical in the first two characters ++ was bound. ++ ++h. Fixed a bug that caused history expansion to be attempted on $'...' ++ single-quoted strings. ++ ++i. Fixed a bug that caused incorrect redisplay when the prompt contained ++ multibyte characters in an `invisible' sequence bracketed by \[ and ++ \]. ++ ++j. Fixed a bug that caused history expansion to short-circuit after ++ encountering a multibyte character. ++ ++k. Fixed a bug that caused applications using the callback interface to not ++ react to SIGINT (or other signals) until another character arrived. ++ ++2. New Features in Readline ++ ++a. New bindable function: menu-complete-backward. ++ ++b. In the vi insertion keymap, C-n is now bound to menu-complete by default, ++ and C-p to menu-complete-backward. ++ ++c. When in vi command mode, repeatedly hitting ESC now does nothing, even ++ when ESC introduces a bound key sequence. This is closer to how ++ historical vi behaves. ++ ++d. New bindable function: skip-csi-sequence. Can be used as a default to ++ consume key sequences generated by keys like Home and End without having ++ to bind all keys. ++ ++e. New application-settable function: rl_filename_rewrite_hook. Can be used ++ to rewite or modify filenames read from the file system before they are ++ compared to the word to be completed. ++ ++f. New bindable variable: skip-completed-text, active when completing in the ++ middle of a word. If enabled, it means that characters in the completion ++ that match characters in the remainder of the word are "skipped" rather ++ than inserted into the line. ++ ++g. The pre-readline-6.0 version of menu completion is available as ++ "old-menu-complete" for users who do not like the readline-6.0 version. ++ ++h. New bindable variable: echo-control-characters. If enabled, and the ++ tty ECHOCTL bit is set, controls the echoing of characters corresponding ++ to keyboard-generated signals. ++ ++i. New bindable variable: enable-meta-key. Controls whether or not readline ++ sends the smm/rmm sequences if the terminal indicates it has a meta key ++ that enables eight-bit characters. ++ ++------------------------------------------------------------------------------- ++This document details the changes between this version, readline-6.0, ++and the previous version, readline-5.2. ++ ++1. Changes to Readline ++ ++a. Fixed a number of redisplay errors in environments supporting multibyte ++ characters. ++ ++b. Fixed bugs in vi command mode that caused motion commands to inappropriately ++ set the mark. ++ ++c. When using the arrow keys in vi insertion mode, readline allows movement ++ beyond the current end of the line (unlike command mode). ++ ++d. Fixed bugs that caused readline to loop when the terminal has been taken ++ away and reads return -1/EIO. ++ ++e. Fixed bugs in redisplay occurring when displaying prompts containing ++ invisible characters. ++ ++f. Fixed a bug that caused the completion append character to not be reset to ++ the default after an application-specified completion function changed it. ++ ++g. Fixed a problem that caused incorrect positioning of the cursor while in ++ emacs editing mode when moving forward at the end of a line while using ++ a locale supporting multibyte characters. ++ ++h. Fixed an off-by-one error that caused readline to drop every 511th ++ character of buffered input. ++ ++i. Fixed a bug that resulted in SIGTERM not being caught or cleaned up. ++ ++j. Fixed redisplay bugs caused by multiline prompts with invisible characters ++ or no characters following the final newline. ++ ++k. Fixed redisplay bug caused by prompts consisting solely of invisible ++ characters. ++ ++l. Fixed a bug in the code that buffers characters received very quickly in ++ succession which caused characters to be dropped. ++ ++m. Fixed a bug that caused readline to reference uninitialized data structures ++ if it received a SIGWINCH before completing initialzation. ++ ++n. Fixed a bug that caused the vi-mode `last command' to be set incorrectly ++ and therefore unrepeatable. ++ ++o. Fixed a bug that caused readline to disable echoing when it was being used ++ with an output file descriptor that was not a terminal. ++ ++p. Readline now blocks SIGINT while manipulating internal data structures ++ during redisplay. ++ ++q. Fixed a bug in redisplay that caused readline to segfault when pasting a ++ very long line (over 130,000 characters). ++ ++r. Fixed bugs in redisplay when using prompts with no visible printing ++ characters. ++ ++s. Fixed a bug that caused redisplay errors when using prompts with invisible ++ characters and numeric arguments to a command in a multibyte locale. ++ ++t. Fixed a bug that caused redisplay errors when using prompts with invisible ++ characters spanning more than two physical screen lines. ++ ++2. New Features in Readline ++ ++a. A new variable, rl_sort_completion_matches; allows applications to inhibit ++ match list sorting (but beware: some things don't work right if ++ applications do this). ++ ++b. A new variable, rl_completion_invoking_key; allows applications to discover ++ the key that invoked rl_complete or rl_menu_complete. ++ ++c. The functions rl_block_sigint and rl_release_sigint are now public and ++ available to calling applications who want to protect critical sections ++ (like redisplay). ++ ++d. The functions rl_save_state and rl_restore_state are now public and ++ available to calling applications; documented rest of readline's state ++ flag values. ++ ++e. A new user-settable variable, `history-size', allows setting the maximum ++ number of entries in the history list. ++ ++f. There is a new implementation of menu completion, with several improvements ++ over the old; the most notable improvement is a better `completions ++ browsing' mode. ++ ++g. The menu completion code now uses the rl_menu_completion_entry_function ++ variable, allowing applications to provide their own menu completion ++ generators. ++ ++h. There is support for replacing a prefix of a pathname with a `...' when ++ displaying possible completions. This is controllable by setting the ++ `completion-prefix-display-length' variable. Matches with a common prefix ++ longer than this value have the common prefix replaced with `...'. ++ ++i. There is a new `revert-all-at-newline' variable. If enabled, readline will ++ undo all outstanding changes to all history lines when `accept-line' is ++ executed. ++ ++------------------------------------------------------------------------------- ++This document details the changes between this version, readline-5.2, ++and the previous version, readline-5.1. ++ ++1. Changes to Readline ++ ++a. Fixed a problem that caused segmentation faults when using readline in ++ callback mode and typing consecutive DEL characters on an empty line. ++ ++b. Fixed several redisplay problems with multibyte characters, all having to ++ do with the different code paths and variable meanings between single-byte ++ and multibyte character redisplay. ++ ++c. Fixed a problem with key sequence translation when presented with the ++ sequence \M-\C-x. ++ ++d. Fixed a problem that prevented the `a' command in vi mode from being ++ undone and redone properly. ++ ++e. Fixed a problem that prevented empty inserts in vi mode from being undone ++ properly. ++ ++f. Fixed a problem that caused readline to initialize with an incorrect idea ++ of whether or not the terminal can autowrap. ++ ++g. Fixed output of key bindings (like bash `bind -p') to honor the setting of ++ convert-meta and use \e where appropriate. ++ ++h. Changed the default filename completion function to call the filename ++ dequoting function if the directory completion hook isn't set. This means ++ that any directory completion hooks need to dequote the directory name, ++ since application-specific hooks need to know how the word was quoted, ++ even if no other changes are made. ++ ++i. Fixed a bug with creating the prompt for a non-interactive search string ++ when there are non-printing characters in the primary prompt. ++ ++j. Fixed a bug that caused prompts with invisible characters to be redrawn ++ multiple times in a multibyte locale. ++ ++k. Fixed a bug that could cause the key sequence scanning code to return the ++ wrong function. ++ ++l. Fixed a problem with the callback interface that caused it to fail when ++ using multi-character keyboard macros. ++ ++m. Fixed a bug that could cause a core dump when an edited history entry was ++ re-executed under certain conditions. ++ ++n. Fixed a bug that caused readline to reference freed memory when attmpting ++ to display a portion of the prompt. ++ ++o. Fixed a bug with prompt redisplay in a multi-byte locale to avoid redrawing ++ the prompt and input line multiple times. ++ ++p. Fixed history expansion to not be confused by here-string redirection. ++ ++q. Readline no longer treats read errors by converting them to newlines, as ++ it does with EOF. This caused partial lines to be returned from readline(). ++ ++r. Fixed a redisplay bug that occurred in multibyte-capable locales when the ++ prompt was one character longer than the screen width. ++ ++2. New Features in Readline ++ ++a. Calling applications can now set the keyboard timeout to 0, allowing ++ poll-like behavior. ++ ++b. The value of SYS_INPUTRC (configurable at compilation time) is now used as ++ the default last-ditch startup file. ++ ++c. The history file reading functions now allow windows-like \r\n line ++ terminators. ++ ++------------------------------------------------------------------------------- + This document details the changes between this version, readline-5.1, + and the previous version, readline-5.0. + +--- a/readline/COPYING ++++ b/readline/COPYING +@@ -1,285 +1,626 @@ +- GNU GENERAL PUBLIC LICENSE +- Version 2, June 1991 ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 + +- Copyright (C) 1989, 1991 Free Software Foundation, Inc. +- 59 Temple Place, Suite 330, Boston, MA 02111 USA ++ Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +- Preamble ++ Preamble + +- The licenses for most software are designed to take away your +-freedom to share and change it. By contrast, the GNU General Public +-License is intended to guarantee your freedom to share and change free +-software--to make sure the software is free for all its users. This +-General Public License applies to most of the Free Software +-Foundation's software and to any other program whose authors commit to +-using it. (Some other Free Software Foundation software is covered by +-the GNU Library General Public License instead.) You can apply it to ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for +-this service if you wish), that you receive source code or can get it +-if you want it, that you can change the software or use pieces of it +-in new free programs; and that you know you can do these things. ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. + +- To protect your rights, we need to make restrictions that forbid +-anyone to deny you these rights or to ask you to surrender the rights. +-These restrictions translate to certain responsibilities for you if you +-distribute copies of the software, or if you modify it. ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +-gratis or for a fee, you must give the recipients all the rights that +-you have. You must make sure that they, too, receive or can get the +-source code. And you must show them these terms so they know their +-rights. +- +- We protect your rights with two steps: (1) copyright the software, and +-(2) offer you this license which gives you legal permission to copy, +-distribute and/or modify the software. +- +- Also, for each author's protection and ours, we want to make certain +-that everyone understands that there is no warranty for this free +-software. If the software is modified by someone else and passed on, we +-want its recipients to know that what they have is not the original, so +-that any problems introduced by others will not reflect on the original +-authors' reputations. +- +- Finally, any free program is threatened constantly by software +-patents. We wish to avoid the danger that redistributors of a free +-program will individually obtain patent licenses, in effect making the +-program proprietary. To prevent this, we have made it clear that any +-patent must be licensed for everyone's free use or not licensed at all. ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and + modification follow. +- +- GNU GENERAL PUBLIC LICENSE +- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +- +- 0. This License applies to any program or other work which contains +-a notice placed by the copyright holder saying it may be distributed +-under the terms of this General Public License. The "Program", below, +-refers to any such program or work, and a "work based on the Program" +-means either the Program or any derivative work under copyright law: +-that is to say, a work containing the Program or a portion of it, +-either verbatim or with modifications and/or translated into another +-language. (Hereinafter, translation is included without limitation in +-the term "modification".) Each licensee is addressed as "you". +- +-Activities other than copying, distribution and modification are not +-covered by this License; they are outside its scope. The act of +-running the Program is not restricted, and the output from the Program +-is covered only if its contents constitute a work based on the +-Program (independent of having been made by running the Program). +-Whether that is true depends on what the Program does. +- +- 1. You may copy and distribute verbatim copies of the Program's +-source code as you receive it, in any medium, provided that you +-conspicuously and appropriately publish on each copy an appropriate +-copyright notice and disclaimer of warranty; keep intact all the +-notices that refer to this License and to the absence of any warranty; +-and give any other recipients of the Program a copy of this License +-along with the Program. +- +-You may charge a fee for the physical act of transferring a copy, and +-you may at your option offer warranty protection in exchange for a fee. +- +- 2. You may modify your copy or copies of the Program or any portion +-of it, thus forming a work based on the Program, and copy and +-distribute such modifications or work under the terms of Section 1 +-above, provided that you also meet all of these conditions: +- +- a) You must cause the modified files to carry prominent notices +- stating that you changed the files and the date of any change. +- +- b) You must cause any work that you distribute or publish, that in +- whole or in part contains or is derived from the Program or any +- part thereof, to be licensed as a whole at no charge to all third +- parties under the terms of this License. +- +- c) If the modified program normally reads commands interactively +- when run, you must cause it, when started running for such +- interactive use in the most ordinary way, to print or display an +- announcement including an appropriate copyright notice and a +- notice that there is no warranty (or else, saying that you provide +- a warranty) and that users may redistribute the program under +- these conditions, and telling the user how to view a copy of this +- License. (Exception: if the Program itself is interactive but +- does not normally print such an announcement, your work based on +- the Program is not required to print an announcement.) +- +-These requirements apply to the modified work as a whole. If +-identifiable sections of that work are not derived from the Program, +-and can be reasonably considered independent and separate works in +-themselves, then this License, and its terms, do not apply to those +-sections when you distribute them as separate works. But when you +-distribute the same sections as part of a whole which is a work based +-on the Program, the distribution of the whole must be on the terms of +-this License, whose permissions for other licensees extend to the +-entire whole, and thus to each and every part regardless of who wrote it. +- +-Thus, it is not the intent of this section to claim rights or contest +-your rights to work written entirely by you; rather, the intent is to +-exercise the right to control the distribution of derivative or +-collective works based on the Program. +- +-In addition, mere aggregation of another work not based on the Program +-with the Program (or with a work based on the Program) on a volume of +-a storage or distribution medium does not bring the other work under +-the scope of this License. +- +- 3. You may copy and distribute the Program (or a work based on it, +-under Section 2) in object code or executable form under the terms of +-Sections 1 and 2 above provided that you also do one of the following: +- +- a) Accompany it with the complete corresponding machine-readable +- source code, which must be distributed under the terms of Sections +- 1 and 2 above on a medium customarily used for software interchange; or, +- +- b) Accompany it with a written offer, valid for at least three +- years, to give any third party, for a charge no more than your +- cost of physically performing source distribution, a complete +- machine-readable copy of the corresponding source code, to be +- distributed under the terms of Sections 1 and 2 above on a medium +- customarily used for software interchange; or, +- +- c) Accompany it with the information you received as to the offer +- to distribute corresponding source code. (This alternative is +- allowed only for noncommercial distribution and only if you +- received the program in object code or executable form with such +- an offer, in accord with Subsection b above.) +- +-The source code for a work means the preferred form of the work for +-making modifications to it. For an executable work, complete source +-code means all the source code for all modules it contains, plus any +-associated interface definition files, plus the scripts used to +-control compilation and installation of the executable. However, as a +-special exception, the source code distributed need not include +-anything that is normally distributed (in either source or binary +-form) with the major components (compiler, kernel, and so on) of the +-operating system on which the executable runs, unless that component +-itself accompanies the executable. +- +-If distribution of executable or object code is made by offering +-access to copy from a designated place, then offering equivalent +-access to copy the source code from the same place counts as +-distribution of the source code, even though third parties are not +-compelled to copy the source along with the object code. +- +- 4. You may not copy, modify, sublicense, or distribute the Program +-except as expressly provided under this License. Any attempt +-otherwise to copy, modify, sublicense or distribute the Program is +-void, and will automatically terminate your rights under this License. +-However, parties who have received copies, or rights, from you under +-this License will not have their licenses terminated so long as such +-parties remain in full compliance. +- +- 5. You are not required to accept this License, since you have not +-signed it. However, nothing else grants you permission to modify or +-distribute the Program or its derivative works. These actions are +-prohibited by law if you do not accept this License. Therefore, by +-modifying or distributing the Program (or any work based on the +-Program), you indicate your acceptance of this License to do so, and +-all its terms and conditions for copying, distributing or modifying +-the Program or works based on it. +- +- 6. Each time you redistribute the Program (or any work based on the +-Program), the recipient automatically receives a license from the +-original licensor to copy, distribute or modify the Program subject to +-these terms and conditions. You may not impose any further +-restrictions on the recipients' exercise of the rights granted herein. +-You are not responsible for enforcing compliance by third parties to ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of + this License. + +- 7. If, as a consequence of a court judgment or allegation of patent +-infringement or for any other reason (not limited to patent issues), +-conditions are imposed on you (whether by court order, agreement or ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not +-excuse you from the conditions of this License. If you cannot +-distribute so as to satisfy simultaneously your obligations under this +-License and any other pertinent obligations, then as a consequence you +-may not distribute the Program at all. For example, if a patent +-license would not permit royalty-free redistribution of the Program by +-all those who receive copies directly or indirectly through you, then +-the only way you could satisfy both it and this License would be to +-refrain entirely from distribution of the Program. +- +-If any portion of this section is held invalid or unenforceable under +-any particular circumstance, the balance of the section is intended to +-apply and the section as a whole is intended to apply in other +-circumstances. +- +-It is not the purpose of this section to induce you to infringe any +-patents or other property right claims or to contest validity of any +-such claims; this section has the sole purpose of protecting the +-integrity of the free software distribution system, which is +-implemented by public license practices. Many people have made +-generous contributions to the wide range of software distributed +-through that system in reliance on consistent application of that +-system; it is up to the author/donor to decide if he or she is willing +-to distribute software through any other system and a licensee cannot +-impose that choice. +- +-This section is intended to make thoroughly clear what is believed to +-be a consequence of the rest of this License. +- +- 8. If the distribution and/or use of the Program is restricted in +-certain countries either by patents or by copyrighted interfaces, the +-original copyright holder who places the Program under this License +-may add an explicit geographical distribution limitation excluding +-those countries, so that distribution is permitted only in or among +-countries not thus excluded. In such case, this License incorporates +-the limitation as if written in the body of this License. +- +- 9. The Free Software Foundation may publish revised and/or new versions +-of the General Public License from time to time. Such new versions will ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + +-Each version is given a distinguishing version number. If the Program +-specifies a version number of this License which applies to it and "any +-later version", you have the option of following the terms and conditions +-either of that version or of any later version published by the Free +-Software Foundation. If the Program does not specify a version number of +-this License, you may choose any version ever published by the Free Software +-Foundation. +- +- 10. If you wish to incorporate parts of the Program into other free +-programs whose distribution conditions are different, write to the author +-to ask for permission. For software which is copyrighted by the Free +-Software Foundation, write to the Free Software Foundation; we sometimes +-make exceptions for this. Our decision will be guided by the two goals +-of preserving the free status of all derivatives of our free software and +-of promoting the sharing and reuse of software generally. +- +- NO WARRANTY +- +- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +-REPAIR OR CORRECTION. +- +- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +-POSSIBILITY OF SUCH DAMAGES. +- +- END OF TERMS AND CONDITIONS +- +- Appendix: How to Apply These Terms to Your New Programs ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it +@@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively +-convey the exclusion of warranty; and each file should have at least ++state the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + +- Copyright (C) 19yy ++ Copyright (C) + +- This program is free software; you can redistribute it and/or modify ++ This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2 of the License, or ++ 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, +@@ -304,36 +645,30 @@ the "copyright" line and a pointer to where the full notice is found. + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA ++ along with this program. If not, see . + + Also add information on how to contact you by electronic and paper mail. + +-If the program is interactive, make it output a short notice like this +-when it starts in an interactive mode: ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: + +- Gnomovision version 69, Copyright (C) 19yy name of author +- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the appropriate +-parts of the General Public License. Of course, the commands you use may +-be called something other than `show w' and `show c'; they could even be +-mouse-clicks or menu items--whatever suits your program. +- +-You should also get your employer (if you work as a programmer) or your +-school, if any, to sign a "copyright disclaimer" for the program, if +-necessary. Here is a sample; alter the names: +- +- Yoyodyne, Inc., hereby disclaims all copyright interest in the program +- `Gnomovision' (which makes passes at compilers) written by James Hacker. +- +- , 1 April 1989 +- Ty Coon, President of Vice +- +-This General Public License does not permit incorporating your program into +-proprietary programs. If your program is a subroutine library, you may +-consider it more useful to permit linking proprietary applications with the +-library. If this is what you want to do, use the GNU Library General +-Public License instead of this License. ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +--- a/readline/ChangeLog.gdb ++++ b/readline/ChangeLog.gdb +@@ -1,3 +1,12 @@ ++2011-04-30 Jan Kratochvil ++ ++ Workaround gdb.base/completion.exp regression on readline-6.2. ++ * complete.c (get_y_or_n): Disable the return on RL_STATE_CALLBACK. ++ ++2011-04-25 Jan Kratochvil ++ ++ Imported readline 6.2, and upstream patch 001. ++ + 2011-03-04 Michael Snyder + + * bind.c (rl_function_dumper): Free allocated memory. +--- a/readline/INSTALL ++++ b/readline/INSTALL +@@ -1,7 +1,7 @@ + Basic Installation + ================== + +-These are installation instructions for Readline-5.1. ++These are installation instructions for Readline-6.2. + + The simplest way to compile readline is: + +--- a/readline/MANIFEST ++++ b/readline/MANIFEST +@@ -3,6 +3,7 @@ + # + doc d + examples d ++examples/autoconf d + examples/rlfe d + support d + shlib d +@@ -26,6 +27,7 @@ histlib.h f + keymaps.h f + posixdir.h f + posixjmp.h f ++posixselect.h f + posixstat.h f + readline.h f + rlconf.h f +@@ -69,11 +71,13 @@ undo.c f + util.c f + vi_keymap.c f + vi_mode.c f ++xfree.c f + xmalloc.c f + history.c f + histexpand.c f + histfile.c f + histsearch.c f ++patchlevel f + shlib/Makefile.in f + support/config.guess f + support/config.rpath f +@@ -107,12 +111,16 @@ examples/manexamp.c f + examples/readlinebuf.h f + examples/rl-fgets.c f + examples/rlcat.c f ++examples/rlevent.c f + examples/rltest.c f + examples/rl.c f + examples/rlptytest.c f + examples/rlversion.c f + examples/histexamp.c f + examples/Inputrc f ++examples/autoconf/BASH_CHECK_LIB_TERMCAP f ++examples/autoconf/RL_LIB_READLINE_VERSION f ++examples/autoconf/wi_LIB_READLINE f + examples/rlfe/ChangeLog f + examples/rlfe/Makefile.in f + examples/rlfe/README f +@@ -124,6 +132,7 @@ examples/rlfe/os.h f + examples/rlfe/pty.c f + examples/rlfe/rlfe.c f + examples/rlfe/screen.h f ++examples/rlwrap-0.30.tar.gz f + # formatted documentation, from MANIFEST.doc + doc/readline.ps f + doc/history.ps f +--- a/readline/Makefile.in ++++ b/readline/Makefile.in +@@ -1,20 +1,20 @@ + ## -*- text -*- ## + # Master Makefile for the GNU readline library. +-# Copyright (C) 1994-2004 Free Software Foundation, Inc. ++# Copyright (C) 1994-2009 Free Software Foundation, Inc. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# 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. ++# 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 . + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + RL_LIBRARY_VERSION = @LIBVERSION@ + RL_LIBRARY_NAME = readline + +@@ -58,7 +58,7 @@ libdir = @libdir@ + mandir = @mandir@ + includedir = @includedir@ + datadir = @datadir@ +-localedir = $(datadir)/locale ++localedir = @localedir@ + + infodir = @infodir@ + +@@ -68,7 +68,7 @@ man3dir = $(mandir)/man3 + DESTDIR = + + # Programs to make tags files. +-ETAGS = etags -tw ++ETAGS = etags + CTAGS = ctags -tw + + CFLAGS = @CFLAGS@ +@@ -100,8 +100,6 @@ GCC_LINT_CFLAGS = $(XCCFLAGS) $(GCC_LINT_FLAGS) @CFLAGS@ @LOCAL_CFLAGS@ + LIBRARY_NAME = libreadline.a + STATIC_LIBS = libreadline.a libhistory.a + +-WCWIDTH_OBJ = @WCWIDTH_OBJ@ +- + # The C code source files for this library. + CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \ + $(srcdir)/vi_mode.c $(srcdir)/parens.c $(srcdir)/rltty.c \ +@@ -109,26 +107,28 @@ CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \ + $(srcdir)/display.c $(srcdir)/signals.c $(srcdir)/emacs_keymap.c \ + $(srcdir)/vi_keymap.c $(srcdir)/util.c $(srcdir)/kill.c \ + $(srcdir)/undo.c $(srcdir)/macro.c $(srcdir)/input.c \ +- $(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c \ ++ $(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c $(srcdir)/xfree.c \ + $(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \ + $(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \ + $(srcdir)/shell.c $(srcdir)/savestring.c $(srcdir)/tilde.c \ + $(srcdir)/text.c $(srcdir)/misc.c $(srcdir)/compat.c \ +- $(srcdir)/mbutil.c $(srcdir)/support/wcwidth.c ++ $(srcdir)/mbutil.c + + # The header files for this library. +-HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \ +- posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \ +- ansi_stdlib.h tcap.h rlstdc.h xmalloc.h rlprivate.h rlshell.h \ +- rltypedefs.h rlmbutil.h ++HSOURCES = $(srcdir)/readline.h $(srcdir)/rldefs.h $(srcdir)/chardefs.h \ ++ $(srcdir)/keymaps.h $(srcdir)/history.h $(srcdir)/histlib.h \ ++ $(srcdir)/posixstat.h $(srcdir)/posixdir.h $(srcdir)/posixjmp.h \ ++ $(srcdir)/tilde.h $(srcdir)/rlconf.h $(srcdir)/rltty.h \ ++ $(srcdir)/ansi_stdlib.h $(srcdir)/tcap.h $(srcdir)/rlstdc.h \ ++ $(srcdir)/xmalloc.h $(srcdir)/rlprivate.h $(srcdir)/rlshell.h \ ++ $(srcdir)/rltypedefs.h $(srcdir)/rlmbutil.h + + HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o mbutil.o + TILDEOBJ = tilde.o + OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \ + rltty.o complete.o bind.o isearch.o display.o signals.o \ + util.o kill.o undo.o macro.o input.o callback.o terminal.o \ +- text.o nls.o misc.o compat.o xmalloc.o $(HISTOBJ) $(TILDEOBJ) \ +- $(WCWIDTH_OBJ) ++ text.o nls.o misc.o compat.o xfree.o xmalloc.o $(HISTOBJ) $(TILDEOBJ) + + # The texinfo files which document this library. + DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo +@@ -159,15 +159,11 @@ libreadline.a: $(OBJECTS) + $(AR) $(ARFLAGS) $@ $(OBJECTS) + -test -n "$(RANLIB)" && $(RANLIB) $@ + +-libhistory.a: $(HISTOBJ) xmalloc.o ++libhistory.a: $(HISTOBJ) xmalloc.o xfree.o + $(RM) $@ +- $(AR) $(ARFLAGS) $@ $(HISTOBJ) xmalloc.o ++ $(AR) $(ARFLAGS) $@ $(HISTOBJ) xmalloc.o xfree.o + -test -n "$(RANLIB)" && $(RANLIB) $@ + +-wcwidth.o: $(srcdir)/support/wcwidth.c +- $(RM) $@ +- $(CC) $(CCFLAGS) -c $(srcdir)/support/wcwidth.c +- + # Since tilde.c is shared between readline and bash, make sure we compile + # it with the right flags when it's built as part of readline + tilde.o: tilde.c +@@ -175,7 +171,7 @@ tilde.o: tilde.c + $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -c $(srcdir)/tilde.c + + readline: $(OBJECTS) readline.h rldefs.h chardefs.h ./libreadline.a +- $(CC) $(CCFLAGS) -o $@ ./examples/rl.c ./libreadline.a ${TERMCAP_LIB} ++ $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -o $@ $(top_srcdir)/examples/rl.c ./libreadline.a ${TERMCAP_LIB} + + lint: force + $(MAKE) $(MFLAGS) CCFLAGS='$(GCC_LINT_CFLAGS)' static +@@ -200,6 +196,7 @@ stamp-h: config.status $(srcdir)/config.h.in + #$(srcdir)/configure: $(srcdir)/configure.in ## Comment-me-out in distribution + # cd $(srcdir) && autoconf ## Comment-me-out in distribution + ++ + shared: force + -test -d shlib || mkdir shlib + -( cd shlib ; ${MAKE} ${MFLAGS} all ) +@@ -214,17 +211,6 @@ examples: force + + force: + +-install-headers: installdirs ${INSTALLED_HEADERS} +- for f in ${INSTALLED_HEADERS}; do \ +- $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(includedir)/readline ; \ +- done +- +-uninstall-headers: +- -test -n "$(includedir)" && cd $(DESTDIR)$(includedir)/readline && \ +- ${RM} ${INSTALLED_HEADERS} +- +-maybe-uninstall-headers: uninstall-headers +- + ## GDB LOCAL + ## Don't mess with people's installed readline's. + ## This tries to install this version of readline over whatever +@@ -237,7 +223,18 @@ install: + + #install: $(INSTALL_TARGETS) + +-install-static: installdirs $(STATIC_LIBS) install-headers install-doc ++install-headers: installdirs ${INSTALLED_HEADERS} ++ for f in ${INSTALLED_HEADERS}; do \ ++ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(includedir)/readline ; \ ++ done ++ ++uninstall-headers: ++ -test -n "$(includedir)" && cd $(DESTDIR)$(includedir)/readline && \ ++ ${RM} ${INSTALLED_HEADERS} ++ ++maybe-uninstall-headers: uninstall-headers ++ ++install-static: installdirs $(STATIC_LIBS) install-headers install-doc install-examples + -$(MV) $(DESTDIR)$(libdir)/libreadline.a $(DESTDIR)$(libdir)/libreadline.old + $(INSTALL_DATA) libreadline.a $(DESTDIR)$(libdir)/libreadline.a + -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libreadline.a +@@ -250,7 +247,7 @@ installdirs: $(srcdir)/support/mkinstalldirs + $(DESTDIR)$(includedir)/readline $(DESTDIR)$(libdir) \ + $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir) + +-uninstall: uninstall-headers uninstall-doc ++uninstall: uninstall-headers uninstall-doc uninstall-examples + -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 ) +@@ -261,6 +258,12 @@ install-shared: installdirs install-headers shared install-doc + uninstall-shared: maybe-uninstall-headers + -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) + ++install-examples: installdirs install-headers shared ++ -( cd examples ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install ) ++ ++uninstall-examples: maybe-uninstall-headers ++ -( cd examples; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall ) ++ + install-doc: installdirs + -( if test -d doc ; then \ + cd doc && \ +@@ -274,10 +277,10 @@ uninstall-doc: + fi ) + + TAGS: force +- $(ETAGS) $(CSOURCES) $(HSOURCES) ++ -( cd $(srcdir) && $(ETAGS) $(CSOURCES) $(HSOURCES) ) + + tags: force +- $(CTAGS) $(CSOURCES) $(HSOURCES) ++ -( cd $(srcdir) && $(CTAGS) $(CSOURCES) $(HSOURCES) ) + + clean: force + $(RM) $(OBJECTS) $(STATIC_LIBS) +@@ -299,12 +302,14 @@ distclean maintainer-clean: clean + $(RM) $(CREATED_CONFIGURE) + $(RM) $(CREATED_TAGS) + +-info dvi html pdf: ++info dvi html pdf ps: + -( cd doc && $(MAKE) $(MFLAGS) $@ ) + + install-info: ++install-dvi: + install-html: + install-pdf: ++install-ps: + check: + installcheck: + +@@ -416,6 +421,8 @@ util.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h + vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h + vi_mode.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h + vi_mode.o: history.h ansi_stdlib.h rlstdc.h ++xfree.o: ${BUILD_DIR}/config.h ++xfree.o: ansi_stdlib.h + xmalloc.o: ${BUILD_DIR}/config.h + xmalloc.o: ansi_stdlib.h + +@@ -474,6 +481,7 @@ tilde.o: xmalloc.h + undo.o: xmalloc.h + util.o: xmalloc.h + vi_mode.o: xmalloc.h ++xfree.o: xmalloc.h + xmalloc.o: xmalloc.h + + complete.o: rlmbutil.h +@@ -515,6 +523,7 @@ tilde.o: $(srcdir)/tilde.c + undo.o: $(srcdir)/undo.c + util.o: $(srcdir)/util.c + vi_mode.o: $(srcdir)/vi_mode.c ++xfree.o: $(srcdir)/xfree.c + xmalloc.o: $(srcdir)/xmalloc.c + + histexpand.o: $(srcdir)/histexpand.c +@@ -549,6 +558,7 @@ tilde.o: tilde.c + undo.o: undo.c + util.o: util.c + vi_mode.o: vi_mode.c ++xfree.o: xfree.c + xmalloc.o: xmalloc.c + + histexpand.o: histexpand.c +--- a/readline/NEWS ++++ b/readline/NEWS +@@ -1,32 +1,19 @@ +-This is a terse description of the new features added to readline-5.1 since +-the release of readline-5.0. ++This is a terse description of the new features added to readline-6.2 since ++the release of readline-6.1. + +-1. New Features in Readline ++a. The history library does not try to write the history filename in the ++ current directory if $HOME is unset. This closes a potential security ++ problem if the application does not specify a history filename. + +-a. The key sequence sent by the keypad `delete' key is now automatically +- bound to delete-char. ++b. New bindable variable `completion-display-width' to set the number of ++ columns used when displaying completions. + +-b. A negative argument to menu-complete now cycles backward through the +- completion list. ++c. New bindable variable `completion-case-map' to cause case-insensitive ++ completion to treat `-' and `_' as identical. + +-c. A new bindable readline variable: bind-tty-special-chars. If non-zero, +- readline will bind the terminal special characters to their readline +- equivalents when it's called (on by default). ++d. There are new bindable vi-mode command names to avoid readline's case- ++ insensitive matching not allowing them to be bound separately. + +-d. New bindable command: vi-rubout. Saves deleted text for possible +- reinsertion, as with any vi-mode `text modification' command; `X' is bound +- to this in vi command mode. +- +-e. If the rl_completion_query_items is set to a value < 0, readline never +- asks the user whether or not to view the possible completions. +- +-f. New application-callable auxiliary function, rl_variable_value, returns +- a string corresponding to a readline variable's value. +- +-g. When parsing inputrc files and variable binding commands, the parser +- strips trailing whitespace from values assigned to boolean variables +- before checking them. +- +-h. A new external application-controllable variable that allows the LINES +- and COLUMNS environment variables to set the window size regardless of +- what the kernel returns. ++e. New bindable variable `menu-complete-display-prefix' causes the menu ++ completion code to display the common prefix of the possible completions ++ before cycling through the list, instead of after. +--- a/readline/README ++++ b/readline/README +@@ -1,7 +1,7 @@ + Introduction + ============ + +-This is the Gnu Readline library, version 5.1. ++This is the Gnu Readline library, version 6.2. + + The Readline library provides a set of functions for use by applications + that allow users to edit command lines as they are typed in. Both +@@ -16,8 +16,9 @@ may be used without Readline in applications which desire its + capabilities. + + The Readline library is free software, distributed under the terms of +-the [GNU] General Public License, version 2. For more information, see +-the file COPYING. ++the [GNU] General Public License as published by the Free Software ++Foundation, version 3 of the License. For more information, see the ++file COPYING. + + To build the library, try typing `./configure', then `make'. The + configuration process is automated, so no further intervention should +@@ -183,4 +184,4 @@ list (mirrored to the Usenet newsgroup gnu.bash.bug) often contains + Readline bug reports and fixes. + + Chet Ramey +-chet@po.cwru.edu ++chet.ramey@case.edu +--- a/readline/aclocal.m4 ++++ b/readline/aclocal.m4 +@@ -80,6 +80,9 @@ AC_CACHE_VAL(bash_cv_type_$1, + #if HAVE_INTTYPES_H + #include + #endif ++#if HAVE_STDINT_H ++#include ++#endif + $2 + ], bash_cv_type_$1=yes, bash_cv_type_$1=no)]) + AC_MSG_RESULT($bash_cv_type_$1) +@@ -215,7 +218,7 @@ AC_CACHE_VAL(bash_cv_sys_siglist, + #ifdef HAVE_UNISTD_H + #include + #endif +-#ifndef SYS_SIGLIST_DECLARED ++#if !HAVE_DECL_SYS_SIGLIST + extern char *sys_siglist[]; + #endif + main() +@@ -336,18 +339,18 @@ main() + { + DIR *dir; + int fd, err; +-err = mkdir("/tmp/bash-aclocal", 0700); ++err = mkdir("bash-aclocal", 0700); + if (err < 0) { + perror("mkdir"); + exit(1); + } +-unlink("/tmp/bash-aclocal/not_a_directory"); +-fd = open("/tmp/bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666); ++unlink("bash-aclocal/not_a_directory"); ++fd = open("bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666); + write(fd, "\n", 1); + close(fd); +-dir = opendir("/tmp/bash-aclocal/not_a_directory"); +-unlink("/tmp/bash-aclocal/not_a_directory"); +-rmdir("/tmp/bash-aclocal"); ++dir = opendir("bash-aclocal/not_a_directory"); ++unlink("bash-aclocal/not_a_directory"); ++rmdir("bash-aclocal"); + exit (dir == 0); + }], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no, + [AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no) +@@ -531,6 +534,18 @@ AC_DEFINE(RLIMTYPE, rlim_t) + fi + ]) + ++AC_DEFUN(BASH_TYPE_SIG_ATOMIC_T, ++[AC_CACHE_CHECK([for sig_atomic_t in signal.h], ac_cv_have_sig_atomic_t, ++[AC_TRY_LINK([ ++#include ++],[ sig_atomic_t x; ], ++ac_cv_have_sig_atomic_t=yes, ac_cv_have_sig_atomic_t=no)]) ++if test "$ac_cv_have_sig_atomic_t" = "no" ++then ++ AC_CHECK_TYPE(sig_atomic_t,int) ++fi ++]) ++ + AC_DEFUN(BASH_FUNC_LSTAT, + [dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an + dnl inline function in . +@@ -685,7 +700,7 @@ fi + ]) + + AC_DEFUN(BASH_FUNC_GETCWD, +-[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory]) ++[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory with 0 size]) + AC_CACHE_VAL(bash_cv_getcwd_malloc, + [AC_TRY_RUN([ + #include +@@ -933,7 +948,7 @@ AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS) + fi + ]) + +-AC_DEFUN(BASH_CHECK_LIB_TERMCAP, ++AC_DEFUN([BASH_CHECK_LIB_TERMCAP], + [ + if test "X$bash_cv_termcap_lib" = "X"; then + _bash_needmsg=yes +@@ -1423,19 +1438,19 @@ exit (1); + #if defined (NeXT) + exit (1); + #endif +-err = mkdir("/tmp/bash-aclocal", 0700); ++err = mkdir("bash-aclocal", 0700); + if (err < 0) { + perror ("mkdir"); + exit(1); + } +-fd = mknod ("/tmp/bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0); ++fd = mknod ("bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0); + if (fd == -1) { +- rmdir ("/tmp/bash-aclocal"); ++ rmdir ("bash-aclocal"); + exit (1); + } + close(fd); +-unlink ("/tmp/bash-aclocal/sh-np-autoconf"); +-rmdir ("/tmp/bash-aclocal"); ++unlink ("bash-aclocal/sh-np-autoconf"); ++rmdir ("bash-aclocal"); + exit(0); + }], bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing, + [AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing) +@@ -1540,20 +1555,22 @@ fi + AC_DEFUN(BASH_CHECK_DEV_FD, + [AC_MSG_CHECKING(whether /dev/fd is available) + AC_CACHE_VAL(bash_cv_dev_fd, +-[if test -d /dev/fd && test -r /dev/fd/0 < /dev/null; then ++[bash_cv_dev_fd="" ++if test -d /dev/fd && (exec test -r /dev/fd/0 < /dev/null) ; then + # check for systems like FreeBSD 5 that only provide /dev/fd/[012] +- exec 3<&0 +- if test -r /dev/fd/3; then ++ if (exec test -r /dev/fd/3 3], [ +- mbstate_t ps; +- mbstate_t *psp; +- psp = (mbstate_t *)0; +-], bash_cv_have_mbstate_t=yes, bash_cv_have_mbstate_t=no)]) +-if test $bash_cv_have_mbstate_t = yes; then ++dnl checks for both mbrtowc and mbstate_t ++AC_FUNC_MBRTOWC ++if test $ac_cv_func_mbrtowc = yes; then + AC_DEFINE(HAVE_MBSTATE_T) + fi + ++AC_CHECK_FUNCS(iswlower iswupper towlower towupper iswctype) ++ + AC_CACHE_CHECK([for nl_langinfo and CODESET], bash_cv_langinfo_codeset, + [AC_TRY_LINK( + [#include ], +@@ -1707,6 +1726,50 @@ if test $bash_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET) + fi + ++dnl check for wchar_t in ++AC_CACHE_CHECK([for wchar_t in wchar.h], bash_cv_type_wchar_t, ++[AC_TRY_COMPILE( ++[#include ++], ++[ ++ wchar_t foo; ++ foo = 0; ++], bash_cv_type_wchar_t=yes, bash_cv_type_wchar_t=no)]) ++if test $bash_cv_type_wchar_t = yes; then ++ AC_DEFINE(HAVE_WCHAR_T, 1, [systems should define this type here]) ++fi ++ ++dnl check for wctype_t in ++AC_CACHE_CHECK([for wctype_t in wctype.h], bash_cv_type_wctype_t, ++[AC_TRY_COMPILE( ++[#include ], ++[ ++ wctype_t foo; ++ foo = 0; ++], bash_cv_type_wctype_t=yes, bash_cv_type_wctype_t=no)]) ++if test $bash_cv_type_wctype_t = yes; then ++ AC_DEFINE(HAVE_WCTYPE_T, 1, [systems should define this type here]) ++fi ++ ++dnl check for wint_t in ++AC_CACHE_CHECK([for wint_t in wctype.h], bash_cv_type_wint_t, ++[AC_TRY_COMPILE( ++[#include ], ++[ ++ wint_t foo; ++ foo = 0; ++], bash_cv_type_wint_t=yes, bash_cv_type_wint_t=no)]) ++if test $bash_cv_type_wint_t = yes; then ++ AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here]) ++fi ++ ++if test "$am_cv_func_iconv" = yes; then ++ OLDLIBS="$LIBS" ++ LIBS="$LIBS $LIBICONV" ++ AC_CHECK_FUNCS(locale_charset) ++ LIBS="$OLDLIBS" ++fi ++ + ]) + + dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB +@@ -1714,7 +1777,7 @@ dnl require: + dnl AC_PROG_CC + dnl BASH_CHECK_LIB_TERMCAP + +-AC_DEFUN(RL_LIB_READLINE_VERSION, ++AC_DEFUN([RL_LIB_READLINE_VERSION], + [ + AC_REQUIRE([BASH_CHECK_LIB_TERMCAP]) + +@@ -2331,7 +2394,7 @@ AC_DEFUN([AM_INTL_SUBDIR], + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ + stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +-geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ ++geteuid getgid getuid mempcpy munmap putenv setenv setlocale localeconv stpcpy \ + strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \ + __fsetlocking]) + +@@ -3964,3 +4027,143 @@ AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], + [Define if you have the unsigned long long type.]) + fi + ]) ++ ++dnl From gnulib ++AC_DEFUN([BASH_FUNC_FPURGE], ++[ ++ AC_CHECK_FUNCS_ONCE([fpurge]) ++ AC_CHECK_FUNCS_ONCE([__fpurge]) ++ AC_CHECK_DECLS([fpurge], , , [#include ]) ++]) ++ ++AC_DEFUN([BASH_FUNC_SNPRINTF], ++[ ++ AC_CHECK_FUNCS_ONCE([snprintf]) ++ if test X$ac_cv_func_snprintf = Xyes; then ++ AC_CACHE_CHECK([for standard-conformant snprintf], [bash_cv_func_snprintf], ++ [AC_TRY_RUN([ ++#include ++ ++main() ++{ ++ int n; ++ n = snprintf (0, 0, "%s", "0123456"); ++ exit(n != 7); ++} ++], bash_cv_func_snprintf=yes, bash_cv_func_snprintf=no, ++ [AC_MSG_WARN([cannot check standard snprintf if cross-compiling]) ++ bash_cv_func_snprintf=yes] ++)]) ++ if test $bash_cv_func_snprintf = no; then ++ ac_cv_func_snprintf=no ++ fi ++ fi ++ if test $ac_cv_func_snprintf = no; then ++ AC_DEFINE(HAVE_SNPRINTF, 0, ++ [Define if you have a standard-conformant snprintf function.]) ++ fi ++]) ++ ++AC_DEFUN([BASH_FUNC_VSNPRINTF], ++[ ++ AC_CHECK_FUNCS_ONCE([vsnprintf]) ++ if test X$ac_cv_func_vsnprintf = Xyes; then ++ AC_CACHE_CHECK([for standard-conformant vsnprintf], [bash_cv_func_vsnprintf], ++ [AC_TRY_RUN([ ++#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; ++} ++ ++main() ++{ ++ int n; ++ n = foo("%s", "0123456"); ++ exit(n != 7); ++} ++], bash_cv_func_vsnprintf=yes, bash_cv_func_vsnprintf=no, ++ [AC_MSG_WARN([cannot check standard vsnprintf if cross-compiling]) ++ bash_cv_func_vsnprintf=yes] ++)]) ++ if test $bash_cv_func_vsnprintf = no; then ++ ac_cv_func_vsnprintf=no ++ fi ++ fi ++ if test $ac_cv_func_vsnprintf = no; then ++ AC_DEFINE(HAVE_VSNPRINTF, 0, ++ [Define if you have a standard-conformant vsnprintf function.]) ++ fi ++]) ++ ++AC_DEFUN(BASH_STRUCT_WEXITSTATUS_OFFSET, ++[AC_MSG_CHECKING(for offset of exit status in return status from wait) ++AC_CACHE_VAL(bash_cv_wexitstatus_offset, ++[AC_RUN_IFELSE([ ++#include ++#include ++ ++#include ++ ++main(c, v) ++ int c; ++ char **v; ++{ ++ pid_t pid, p; ++ int s, i, n; ++ ++ s = 0; ++ pid = fork(); ++ if (pid == 0) ++ exit (42); ++ ++ /* wait for the process */ ++ p = wait(&s); ++ if (p != pid) ++ exit (255); ++ ++ /* crack s */ ++ for (i = 0; i < (sizeof(s) - 8); i++) ++ { ++ n = (s >> i) & 0xff; ++ if (n == 42) ++ exit (i); ++ } ++ ++ exit (254); ++} ++], bash_cv_wexitstatus_offset=0, bash_cv_wexitstatus_offset=$?, ++ [AC_MSG_WARN(cannot check WEXITSTATUS offset if cross compiling -- defaulting to 0) ++ bash_cv_wexitstatus_offset=0] ++)]) ++if test "$bash_cv_wexitstatus_offset" -gt 32 ; then ++ AC_MSG_WARN(bad exit status from test program -- defaulting to 0) ++ bash_cv_wexitstatus_offset=0 ++fi ++AC_MSG_RESULT($bash_cv_wexitstatus_offset) ++AC_DEFINE_UNQUOTED([WEXITSTATUS_OFFSET], [$bash_cv_wexitstatus_offset], [Offset of exit status in wait status word]) ++]) +--- a/readline/ansi_stdlib.h ++++ b/readline/ansi_stdlib.h +@@ -6,19 +6,19 @@ + + This file is part of GNU Bash, the Bourne Again SHell. + +- Bash is free software; you can redistribute it and/or modify it under +- the terms of the GNU General Public License as published by the Free +- Software Foundation; either version 2, or (at your option) any later +- version. +- +- Bash is distributed in the hope that it will be useful, but WITHOUT ANY +- WARRANTY; without even the implied warranty of MERCHANTABILITY or +- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- for more details. +- +- You should have received a copy of the GNU General Public License along +- with Bash; see the file COPYING. If not, write to the Free Software +- Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ Bash is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Bash is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Bash. If not, see . ++*/ + + #if !defined (_STDLIB_H_) + #define _STDLIB_H_ 1 +--- a/readline/bind.c ++++ b/readline/bind.c +@@ -1,24 +1,23 @@ + /* bind.c -- key binding and startup file support for the readline library. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2010 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #define READLINE_LIBRARY + +@@ -80,7 +79,7 @@ static int glean_key_from_name PARAMS((char *)); + static int find_boolean_var PARAMS((const char *)); + + static char *_rl_get_string_variable_value PARAMS((const char *)); +-static int substring_member_of_array PARAMS((char *, const char **)); ++static int substring_member_of_array PARAMS((const char *, const char * const *)); + + static int currently_reading_init_file; + +@@ -317,7 +316,7 @@ rl_macro_bind (keyseq, macro, map) + + if (rl_translate_keyseq (macro, macro_keys, ¯o_keys_len)) + { +- free (macro_keys); ++ xfree (macro_keys); + return -1; + } + rl_generic_bind (ISMACR, keyseq, macro_keys, map); +@@ -347,7 +346,7 @@ rl_generic_bind (type, keyseq, data, map) + if (keyseq == 0 || *keyseq == 0) + { + if (type == ISMACR) +- free (data); ++ xfree (data); + return -1; + } + +@@ -358,7 +357,7 @@ rl_generic_bind (type, keyseq, data, map) + KEYS into KEYS_LEN. */ + if (rl_translate_keyseq (keyseq, keys, &keys_len)) + { +- free (keys); ++ xfree (keys); + return -1; + } + +@@ -370,7 +369,10 @@ rl_generic_bind (type, keyseq, data, map) + + ic = uc; + if (ic < 0 || ic >= KEYMAP_SIZE) +- return -1; ++ { ++ xfree (keys); ++ return -1; ++ } + + if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) + { +@@ -411,11 +413,18 @@ rl_generic_bind (type, keyseq, data, map) + else + { + if (map[ic].type == ISMACR) +- free ((char *)map[ic].function); ++ xfree ((char *)map[ic].function); + else if (map[ic].type == ISKMAP) + { + map = FUNCTION_TO_KEYMAP (map, ic); + ic = ANYOTHERKEY; ++ /* If we're trying to override a keymap with a null function ++ (e.g., trying to unbind it), we can't use a null pointer ++ here because that's indistinguishable from having not been ++ overridden. We use a special bindable function that does ++ nothing. */ ++ if (type == ISFUNC && data == 0) ++ data = (char *)_rl_null_function; + } + + map[ic].function = KEYMAP_TO_FUNCTION (data); +@@ -424,7 +433,7 @@ rl_generic_bind (type, keyseq, data, map) + + rl_binding_keymap = map; + } +- free (keys); ++ xfree (keys); + return 0; + } + +@@ -462,12 +471,21 @@ rl_translate_keyseq (seq, array, len) + } + else if (c == 'M') + { +- i++; +- /* XXX - should obey convert-meta setting? */ ++ i++; /* seq[i] == '-' */ ++ /* XXX - obey convert-meta setting */ + if (_rl_convert_meta_chars_to_ascii && _rl_keymap[ESC].type == ISKMAP) + array[l++] = ESC; /* ESC is meta-prefix */ ++ else if (seq[i+1] == '\\' && seq[i+2] == 'C' && seq[i+3] == '-') ++ { ++ i += 4; ++ temp = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i])); ++ array[l++] = META (temp); ++ } + else + { ++ /* This doesn't yet handle things like \M-\a, which may ++ or may not have any reasonable meaning. You're ++ probably better off using straight octal or hex. */ + i++; + array[l++] = META (seq[i]); + } +@@ -565,6 +583,11 @@ rl_untranslate_keyseq (seq) + kseq[i++] = '-'; + c = UNMETA (c); + } ++ else if (c == ESC) ++ { ++ kseq[i++] = '\\'; ++ c = 'e'; ++ } + else if (CTRL_CHAR (c)) + { + kseq[i++] = '\\'; +@@ -613,7 +636,12 @@ _rl_untranslate_macro_value (seq) + *r++ = '-'; + c = UNMETA (c); + } +- else if (CTRL_CHAR (c) && c != ESC) ++ else if (c == ESC) ++ { ++ *r++ = '\\'; ++ c = 'e'; ++ } ++ else if (CTRL_CHAR (c)) + { + *r++ = '\\'; + *r++ = 'C'; +@@ -672,7 +700,7 @@ rl_function_of_keyseq (keyseq, map, type) + { + register int i; + +- if (!map) ++ if (map == 0) + map = _rl_keymap; + + for (i = 0; keyseq && keyseq[i]; i++) +@@ -681,25 +709,27 @@ rl_function_of_keyseq (keyseq, map, type) + + if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) + { +- if (map[ESC].type != ISKMAP) ++ if (map[ESC].type == ISKMAP) ++ { ++ map = FUNCTION_TO_KEYMAP (map, ESC); ++ ic = UNMETA (ic); ++ } ++ /* XXX - should we just return NULL here, since this obviously ++ doesn't match? */ ++ else + { + if (type) + *type = map[ESC].type; + + return (map[ESC].function); + } +- else +- { +- map = FUNCTION_TO_KEYMAP (map, ESC); +- ic = UNMETA (ic); +- } + } + + if (map[ic].type == ISKMAP) + { + /* If this is the last key in the key sequence, return the + map. */ +- if (!keyseq[i + 1]) ++ if (keyseq[i + 1] == '\0') + { + if (type) + *type = ISKMAP; +@@ -709,7 +739,12 @@ rl_function_of_keyseq (keyseq, map, type) + else + map = FUNCTION_TO_KEYMAP (map, ic); + } +- else ++ /* If we're not at the end of the key sequence, and the current key ++ is bound to something other than a keymap, then the entire key ++ sequence is not bound. */ ++ else if (map[ic].type != ISKMAP && keyseq[i+1]) ++ return ((rl_command_func_t *)NULL); ++ else /* map[ic].type != ISKMAP && keyseq[i+1] == 0 */ + { + if (type) + *type = map[ic].type; +@@ -764,10 +799,12 @@ _rl_read_file (filename, sizep) + + if (i < 0) + { +- free (buffer); ++ xfree (buffer); + return ((char *)NULL); + } + ++ RL_CHECK_SIGNALS (); ++ + buffer[i] = '\0'; + if (sizep) + *sizep = i; +@@ -791,6 +828,7 @@ rl_re_read_init_file (count, ignore) + 1. the filename used for the previous call + 2. the value of the shell variable `INPUTRC' + 3. ~/.inputrc ++ 4. /etc/inputrc + If the file existed and could be opened and read, 0 is returned, + otherwise errno is returned. */ + int +@@ -799,17 +837,18 @@ rl_read_init_file (filename) + { + /* Default the filename. */ + if (filename == 0) ++ filename = last_readline_init_file; ++ if (filename == 0) ++ filename = sh_get_env_value ("INPUTRC"); ++ if (filename == 0 || *filename == 0) + { +- filename = last_readline_init_file; +- if (filename == 0) +- filename = sh_get_env_value ("INPUTRC"); +- if (filename == 0) +- filename = DEFAULT_INPUTRC; ++ filename = DEFAULT_INPUTRC; ++ /* Try to read DEFAULT_INPUTRC; fall back to SYS_INPUTRC on failure */ ++ if (_rl_read_init_file (filename, 0) == 0) ++ return 0; ++ filename = SYS_INPUTRC; + } + +- if (*filename == 0) +- filename = DEFAULT_INPUTRC; +- + #if defined (__MSDOS__) + if (_rl_read_init_file (filename, 0) == 0) + return 0; +@@ -832,8 +871,9 @@ _rl_read_init_file (filename, include_level) + + openname = tilde_expand (filename); + buffer = _rl_read_file (openname, &file_size); +- free (openname); ++ xfree (openname); + ++ RL_CHECK_SIGNALS (); + if (buffer == 0) + return (errno); + +@@ -880,7 +920,7 @@ _rl_read_init_file (filename, include_level) + current_readline_init_lineno++; + } + +- free (buffer); ++ xfree (buffer); + currently_reading_init_file = 0; + return (0); + } +@@ -890,10 +930,10 @@ _rl_init_file_error (msg) + const char *msg; + { + if (currently_reading_init_file) +- fprintf (stderr, "readline: %s: line %d: %s\n", current_readline_init_file, ++ _rl_errmsg ("%s: line %d: %s\n", current_readline_init_file, + current_readline_init_lineno, msg); + else +- fprintf (stderr, "readline: %s\n", msg); ++ _rl_errmsg ("%s", msg); + } + + /* **************************************************************** */ +@@ -905,11 +945,11 @@ _rl_init_file_error (msg) + typedef int _rl_parser_func_t PARAMS((char *)); + + /* Things that mean `Control'. */ +-const char *_rl_possible_control_prefixes[] = { ++const char * const _rl_possible_control_prefixes[] = { + "Control-", "C-", "CTRL-", (const char *)NULL + }; + +-const char *_rl_possible_meta_prefixes[] = { ++const char * const _rl_possible_meta_prefixes[] = { + "Meta", "M-", (const char *)NULL + }; + +@@ -971,7 +1011,7 @@ parser_if (args) + `$if term=sun-cmd' into their .inputrc. */ + _rl_parsing_conditionalized_out = _rl_stricmp (args + 5, tname) && + _rl_stricmp (args + 5, rl_terminal_name); +- free (tname); ++ xfree (tname); + } + #if defined (VI_MODE) + else if (_rl_strnicmp (args, "mode=", 5) == 0) +@@ -1068,8 +1108,8 @@ parser_include (args) + } + + /* Associate textual names with actual functions. */ +-static struct { +- const char *name; ++static const struct { ++ const char * const name; + _rl_parser_func_t *function; + } parser_directives [] = { + { "if", parser_if }, +@@ -1321,7 +1361,7 @@ rl_parse_and_bind (string) + else + rl_bind_keyseq (seq, rl_named_function (funname)); + +- free (seq); ++ xfree (seq); + return 0; + } + +@@ -1375,8 +1415,8 @@ rl_parse_and_bind (string) + + #define V_SPECIAL 0x1 + +-static struct { +- const char *name; ++static const struct { ++ const char * const name; + int *value; + int flags; + } boolean_varlist [] = { +@@ -1384,9 +1424,12 @@ static struct { + { "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL }, + { "byte-oriented", &rl_byte_oriented, 0 }, + { "completion-ignore-case", &_rl_completion_case_fold, 0 }, ++ { "completion-map-case", &_rl_completion_case_map, 0 }, + { "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, + { "disable-completion", &rl_inhibit_completion, 0 }, ++ { "echo-control-characters", &_rl_echo_control_chars, 0 }, + { "enable-keypad", &_rl_enable_keypad, 0 }, ++ { "enable-meta-key", &_rl_enable_meta, 0 }, + { "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, + { "history-preserve-point", &_rl_history_preserve_point, 0 }, + { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 }, +@@ -1395,17 +1438,20 @@ static struct { + { "mark-modified-lines", &_rl_mark_modified_lines, 0 }, + { "mark-symlinked-directories", &_rl_complete_mark_symlink_dirs, 0 }, + { "match-hidden-files", &_rl_match_hidden_files, 0 }, ++ { "menu-complete-display-prefix", &_rl_menu_complete_prefix_first, 0 }, + { "meta-flag", &_rl_meta_flag, 0 }, + { "output-meta", &_rl_output_meta_chars, 0 }, + { "page-completions", &_rl_page_completions, 0 }, + { "prefer-visible-bell", &_rl_prefer_visible_bell, V_SPECIAL }, + { "print-completions-horizontally", &_rl_print_completions_horizontally, 0 }, ++ { "revert-all-at-newline", &_rl_revert_all_at_newline, 0 }, + { "show-all-if-ambiguous", &_rl_complete_show_all, 0 }, + { "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 }, ++ { "skip-completed-text", &_rl_skip_completed_text, 0 }, + #if defined (VISIBLE_STATS) + { "visible-stats", &rl_visible_stats, 0 }, + #endif /* VISIBLE_STATS */ +- { (char *)NULL, (int *)NULL } ++ { (char *)NULL, (int *)NULL, 0 } + }; + + static int +@@ -1458,23 +1504,29 @@ typedef int _rl_sv_func_t PARAMS((const char *)); + /* Forward declarations */ + static int sv_bell_style PARAMS((const char *)); + static int sv_combegin PARAMS((const char *)); ++static int sv_dispprefix PARAMS((const char *)); + static int sv_compquery PARAMS((const char *)); ++static int sv_compwidth PARAMS((const char *)); + static int sv_editmode PARAMS((const char *)); ++static int sv_histsize PARAMS((const char *)); + static int sv_isrchterm PARAMS((const char *)); + static int sv_keymap PARAMS((const char *)); + +-static struct { +- const char *name; ++static const struct { ++ const char * const name; + int flags; + _rl_sv_func_t *set_func; + } string_varlist[] = { + { "bell-style", V_STRING, sv_bell_style }, + { "comment-begin", V_STRING, sv_combegin }, ++ { "completion-display-width", V_INT, sv_compwidth }, ++ { "completion-prefix-display-length", V_INT, sv_dispprefix }, + { "completion-query-items", V_INT, sv_compquery }, + { "editing-mode", V_STRING, sv_editmode }, ++ { "history-size", V_INT, sv_histsize }, + { "isearch-terminators", V_STRING, sv_isrchterm }, + { "keymap", V_STRING, sv_keymap }, +- { (char *)NULL, 0 } ++ { (char *)NULL, 0, (_rl_sv_func_t *)0 } + }; + + static int +@@ -1506,8 +1558,6 @@ rl_variable_value (name) + const char *name; + { + register int i; +- int v; +- char *ret; + + /* Check for simple variables first. */ + i = find_boolean_var (name); +@@ -1585,6 +1635,22 @@ sv_combegin (value) + } + + static int ++sv_dispprefix (value) ++ const char *value; ++{ ++ int nval = 0; ++ ++ if (value && *value) ++ { ++ nval = atoi (value); ++ if (nval < 0) ++ nval = 0; ++ } ++ _rl_completion_prefix_display_length = nval; ++ return 0; ++} ++ ++static int + sv_compquery (value) + const char *value; + { +@@ -1601,6 +1667,35 @@ sv_compquery (value) + } + + static int ++sv_compwidth (value) ++ const char *value; ++{ ++ int nval = -1; ++ ++ if (value && *value) ++ nval = atoi (value); ++ ++ _rl_completion_columns = nval; ++ return 0; ++} ++ ++static int ++sv_histsize (value) ++ const char *value; ++{ ++ int nval = 500; ++ ++ if (value && *value) ++ { ++ nval = atoi (value); ++ if (nval < 0) ++ return 1; ++ } ++ stifle_history (nval); ++ return 0; ++} ++ ++static int + sv_keymap (value) + const char *value; + { +@@ -1664,7 +1759,7 @@ sv_isrchterm (value) + rl_translate_keyseq (v + beg, _rl_isearch_terminators, &end); + _rl_isearch_terminators[end] = '\0'; + +- free (v); ++ xfree (v); + return 0; + } + +@@ -1672,11 +1767,11 @@ sv_isrchterm (value) + For example, `Space' returns ' '. */ + + typedef struct { +- const char *name; ++ const char * const name; + int value; + } assoc_list; + +-static assoc_list name_key_alist[] = { ++static const assoc_list name_key_alist[] = { + { "DEL", 0x7f }, + { "ESC", '\033' }, + { "Escape", '\033' }, +@@ -1705,8 +1800,8 @@ glean_key_from_name (name) + } + + /* Auxiliary functions to manage keymaps. */ +-static struct { +- const char *name; ++static const struct { ++ const char * const name; + Keymap map; + } keymap_names[] = { + { "emacs", emacs_standard_keymap }, +@@ -1809,7 +1904,7 @@ rl_list_funmap_names () + for (i = 0; funmap_names[i]; i++) + fprintf (rl_outstream, "%s\n", funmap_names[i]); + +- free (funmap_names); ++ xfree (funmap_names); + } + + static char * +@@ -1948,12 +2043,16 @@ rl_invoking_keyseqs_in_map (function, map) + char *keyname = (char *)xmalloc (6 + strlen (seqs[i])); + + if (key == ESC) +-#if 0 +- sprintf (keyname, "\\e"); +-#else +- /* XXX - experimental */ +- sprintf (keyname, "\\M-"); +-#endif ++ { ++ /* If ESC is the meta prefix and we're converting chars ++ with the eighth bit set to ESC-prefixed sequences, then ++ we can use \M-. Otherwise we need to use the sequence ++ for ESC. */ ++ if (_rl_convert_meta_chars_to_ascii && map[ESC].type == ISKMAP) ++ sprintf (keyname, "\\M-"); ++ else ++ sprintf (keyname, "\\e"); ++ } + else if (CTRL_CHAR (key)) + sprintf (keyname, "\\C-%c", _rl_to_lower (UNCTRL (key))); + else if (key == RUBOUT) +@@ -1971,7 +2070,7 @@ rl_invoking_keyseqs_in_map (function, map) + } + + strcat (keyname, seqs[i]); +- free (seqs[i]); ++ xfree (seqs[i]); + + if (result_index + 2 > result_size) + { +@@ -1983,7 +2082,7 @@ rl_invoking_keyseqs_in_map (function, map) + result[result_index] = (char *)NULL; + } + +- free (seqs); ++ xfree (seqs); + } + break; + } +@@ -2035,10 +2134,10 @@ rl_function_dumper (print_readably) + { + fprintf (rl_outstream, "\"%s\": %s\n", + invokers[j], name); +- free (invokers[j]); ++ xfree (invokers[j]); + } + +- free (invokers); ++ xfree (invokers); + } + } + else +@@ -2062,9 +2161,9 @@ rl_function_dumper (print_readably) + fprintf (rl_outstream, "...\n"); + + for (j = 0; invokers[j]; j++) +- free (invokers[j]); ++ xfree (invokers[j]); + +- free (invokers); ++ xfree (invokers); + } + } + } +@@ -2111,8 +2210,8 @@ _rl_macro_dumper_internal (print_readably, map, prefix) + fprintf (rl_outstream, "%s%s outputs %s\n", prefix ? prefix : "", + keyname, + out ? out : ""); +- free (keyname); +- free (out); ++ xfree (keyname); ++ xfree (out); + break; + case ISFUNC: + break; +@@ -2135,13 +2234,13 @@ _rl_macro_dumper_internal (print_readably, map, prefix) + out = (char *)xmalloc (strlen (keyname) + prefix_len + 1); + strcpy (out, prefix); + strcpy (out + prefix_len, keyname); +- free (keyname); ++ xfree (keyname); + keyname = out; + } + } + + _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname); +- free (keyname); ++ xfree (keyname); + break; + } + } +@@ -2171,7 +2270,6 @@ _rl_get_string_variable_value (name) + { + static char numbuf[32]; + char *ret; +- int n; + + if (_rl_stricmp (name, "bell-style") == 0) + { +@@ -2188,6 +2286,16 @@ _rl_get_string_variable_value (name) + } + else if (_rl_stricmp (name, "comment-begin") == 0) + return (_rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT); ++ else if (_rl_stricmp (name, "completion-display-width") == 0) ++ { ++ sprintf (numbuf, "%d", _rl_completion_columns); ++ return (numbuf); ++ } ++ else if (_rl_stricmp (name, "completion-prefix-display-length") == 0) ++ { ++ sprintf (numbuf, "%d", _rl_completion_prefix_display_length); ++ return (numbuf); ++ } + else if (_rl_stricmp (name, "completion-query-items") == 0) + { + sprintf (numbuf, "%d", rl_completion_query_items); +@@ -2195,6 +2303,11 @@ _rl_get_string_variable_value (name) + } + else if (_rl_stricmp (name, "editing-mode") == 0) + return (rl_get_keymap_name_from_edit_mode ()); ++ else if (_rl_stricmp (name, "history-size") == 0) ++ { ++ sprintf (numbuf, "%d", history_is_stifled() ? history_max_entries : 0); ++ return (numbuf); ++ } + else if (_rl_stricmp (name, "isearch-terminators") == 0) + { + if (_rl_isearch_terminators == 0) +@@ -2203,7 +2316,7 @@ _rl_get_string_variable_value (name) + if (ret) + { + strncpy (numbuf, ret, sizeof (numbuf) - 1); +- free (ret); ++ xfree (ret); + numbuf[sizeof(numbuf) - 1] = '\0'; + } + else +@@ -2267,8 +2380,8 @@ rl_dump_variables (count, key) + /* Return non-zero if any members of ARRAY are a substring in STRING. */ + static int + substring_member_of_array (string, array) +- char *string; +- const char **array; ++ const char *string; ++ const char * const *array; + { + while (*array) + { +--- a/readline/callback.c ++++ b/readline/callback.c +@@ -1,24 +1,24 @@ + /* callback.c -- functions to use readline as an X `callback' mechanism. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -87,6 +87,7 @@ _rl_callback_newline () + } + + readline_internal_setup (); ++ RL_CHECK_SIGNALS (); + } + + /* Install a readline handler, set up the terminal, and issue the prompt. */ +@@ -111,87 +112,101 @@ rl_callback_read_char () + + if (rl_linefunc == NULL) + { +- fprintf (stderr, "readline: readline_callback_read_char() called with no handler!\r\n"); ++ _rl_errmsg ("readline_callback_read_char() called with no handler!"); + abort (); + } + +- memcpy ((void *)olevel, (void *)readline_top_level, sizeof (procenv_t)); +- jcode = setjmp (readline_top_level); ++ memcpy ((void *)olevel, (void *)_rl_top_level, sizeof (procenv_t)); ++ jcode = setjmp (_rl_top_level); + if (jcode) + { + (*rl_redisplay_function) (); + _rl_want_redisplay = 0; +- memcpy ((void *)readline_top_level, (void *)olevel, sizeof (procenv_t)); ++ memcpy ((void *)_rl_top_level, (void *)olevel, sizeof (procenv_t)); + return; + } + +- if (RL_ISSTATE (RL_STATE_ISEARCH)) ++ do + { +- eof = _rl_isearch_callback (_rl_iscxt); +- if (eof == 0 && (RL_ISSTATE (RL_STATE_ISEARCH) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) +- rl_callback_read_char (); ++ RL_CHECK_SIGNALS (); ++ if (RL_ISSTATE (RL_STATE_ISEARCH)) ++ { ++ eof = _rl_isearch_callback (_rl_iscxt); ++ if (eof == 0 && (RL_ISSTATE (RL_STATE_ISEARCH) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) ++ rl_callback_read_char (); + +- return; +- } +- else if (RL_ISSTATE (RL_STATE_NSEARCH)) +- { +- eof = _rl_nsearch_callback (_rl_nscxt); +- return; +- } +- else if (RL_ISSTATE (RL_STATE_NUMERICARG)) +- { +- eof = _rl_arg_callback (_rl_argcxt); +- if (eof == 0 && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) +- rl_callback_read_char (); +- /* XXX - this should handle _rl_last_command_was_kill better */ +- else if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) +- _rl_internal_char_cleanup (); ++ return; ++ } ++ else if (RL_ISSTATE (RL_STATE_NSEARCH)) ++ { ++ eof = _rl_nsearch_callback (_rl_nscxt); ++ return; ++ } ++#if defined (VI_MODE) ++ else if (RL_ISSTATE (RL_STATE_VIMOTION)) ++ { ++ eof = _rl_vi_domove_callback (_rl_vimvcxt); ++ /* Should handle everything, including cleanup, numeric arguments, ++ and turning off RL_STATE_VIMOTION */ ++ if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) ++ _rl_internal_char_cleanup (); + +- return; +- } +- else if (RL_ISSTATE (RL_STATE_MULTIKEY)) +- { +- eof = _rl_dispatch_callback (_rl_kscxt); /* For now */ +- while ((eof == -1 || eof == -2) && RL_ISSTATE (RL_STATE_MULTIKEY) && _rl_kscxt && (_rl_kscxt->flags & KSEQ_DISPATCHED)) +- eof = _rl_dispatch_callback (_rl_kscxt); +- if (RL_ISSTATE (RL_STATE_MULTIKEY) == 0) ++ return; ++ } ++#endif ++ else if (RL_ISSTATE (RL_STATE_NUMERICARG)) + { +- _rl_internal_char_cleanup (); +- _rl_want_redisplay = 1; ++ eof = _rl_arg_callback (_rl_argcxt); ++ if (eof == 0 && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING)) ++ rl_callback_read_char (); ++ /* XXX - this should handle _rl_last_command_was_kill better */ ++ else if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) ++ _rl_internal_char_cleanup (); ++ ++ return; + } +- } +- else if (_rl_callback_func) +- { +- /* This allows functions that simply need to read an additional character +- (like quoted-insert) to register a function to be called when input is +- available. _rl_callback_data is simply a pointer to a struct that has +- the argument count originally passed to the registering function and +- space for any additional parameters. */ +- eof = (*_rl_callback_func) (_rl_callback_data); +- /* If the function `deregisters' itself, make sure the data is cleaned +- up. */ +- if (_rl_callback_func == 0) ++ else if (RL_ISSTATE (RL_STATE_MULTIKEY)) + { +- if (_rl_callback_data) ++ eof = _rl_dispatch_callback (_rl_kscxt); /* For now */ ++ while ((eof == -1 || eof == -2) && RL_ISSTATE (RL_STATE_MULTIKEY) && _rl_kscxt && (_rl_kscxt->flags & KSEQ_DISPATCHED)) ++ eof = _rl_dispatch_callback (_rl_kscxt); ++ if (RL_ISSTATE (RL_STATE_MULTIKEY) == 0) + { +- _rl_callback_data_dispose (_rl_callback_data); +- _rl_callback_data = 0; ++ _rl_internal_char_cleanup (); ++ _rl_want_redisplay = 1; + } +- _rl_internal_char_cleanup (); + } +- } +- else +- eof = readline_internal_char (); ++ else if (_rl_callback_func) ++ { ++ /* This allows functions that simply need to read an additional ++ character (like quoted-insert) to register a function to be ++ called when input is available. _rl_callback_data is simply a ++ pointer to a struct that has the argument count originally ++ passed to the registering function and space for any additional ++ parameters. */ ++ eof = (*_rl_callback_func) (_rl_callback_data); ++ /* If the function `deregisters' itself, make sure the data is ++ cleaned up. */ ++ if (_rl_callback_func == 0) ++ { ++ if (_rl_callback_data) ++ { ++ _rl_callback_data_dispose (_rl_callback_data); ++ _rl_callback_data = 0; ++ } ++ _rl_internal_char_cleanup (); ++ } ++ } ++ else ++ eof = readline_internal_char (); + +- if (rl_done == 0 && _rl_want_redisplay) +- { +- (*rl_redisplay_function) (); +- _rl_want_redisplay = 0; +- } ++ RL_CHECK_SIGNALS (); ++ if (rl_done == 0 && _rl_want_redisplay) ++ { ++ (*rl_redisplay_function) (); ++ _rl_want_redisplay = 0; ++ } + +- /* We loop in case some function has pushed input back with rl_execute_next. */ +- for (;;) +- { + if (rl_done) + { + line = readline_internal_teardown (eof); +@@ -213,11 +228,8 @@ rl_callback_read_char () + if (in_handler == 0 && rl_linefunc) + _rl_callback_newline (); + } +- if (rl_pending_input || _rl_pushed_input_available () || RL_ISSTATE (RL_STATE_MACROINPUT)) +- eof = readline_internal_char (); +- else +- break; + } ++ while (rl_pending_input || _rl_pushed_input_available () || RL_ISSTATE (RL_STATE_MACROINPUT)); + } + + /* Remove the handler, and make sure the terminal is in its normal state. */ +@@ -226,6 +238,7 @@ rl_callback_handler_remove () + { + rl_linefunc = NULL; + RL_UNSETSTATE (RL_STATE_CALLBACK); ++ RL_CHECK_SIGNALS (); + if (in_handler) + { + in_handler = 0; +@@ -254,8 +267,7 @@ _rl_callback_data_alloc (count) + void _rl_callback_data_dispose (arg) + _rl_callback_generic_arg *arg; + { +- if (arg) +- free (arg); ++ xfree (arg); + } + + #endif +--- a/readline/chardefs.h ++++ b/readline/chardefs.h +@@ -1,24 +1,23 @@ + /* chardefs.h -- Character definitions for readline. */ + +-/* Copyright (C) 1994 Free Software Foundation, Inc. ++/* Copyright (C) 1994-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #ifndef _CHARDEFS_H_ + #define _CHARDEFS_H_ +--- a/readline/compat.c ++++ b/readline/compat.c +@@ -1,24 +1,24 @@ + /* compat.c -- backwards compatibility functions. */ + +-/* Copyright (C) 2000 Free Software Foundation, Inc. ++/* Copyright (C) 2000-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +--- a/readline/complete.c ++++ b/readline/complete.c +@@ -1,24 +1,24 @@ + /* complete.c -- filename completion for readline. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2011 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -110,8 +110,8 @@ static int get_y_or_n PARAMS((int)); + static int _rl_internal_pager PARAMS((int)); + static char *printable_part PARAMS((char *)); + static int fnwidth PARAMS((const char *)); +-static int fnprint PARAMS((const char *)); +-static int print_filename PARAMS((char *, char *)); ++static int fnprint PARAMS((const char *, int)); ++static int print_filename PARAMS((char *, char *, int)); + + static char **gen_completion_matches PARAMS((char *, int, int, rl_compentry_func_t *, int, int)); + +@@ -119,9 +119,11 @@ static char **remove_duplicate_matches PARAMS((char **)); + static void insert_match PARAMS((char *, int, int, char *)); + static int append_to_match PARAMS((char *, int, int, int)); + static void insert_all_matches PARAMS((char **, int, char *)); ++static int complete_fncmp PARAMS((const char *, int, const char *, int)); + static void display_matches PARAMS((char **)); + static int compute_lcd_of_matches PARAMS((char **, int, const char *)); + static int postprocess_matches PARAMS((char ***, int)); ++static int complete_get_screenwidth PARAMS((void)); + + static char *make_quoted_replacement PARAMS((char *, int, char *)); + +@@ -157,13 +159,27 @@ int _rl_print_completions_horizontally; + #if defined (__MSDOS__) && !defined (__DJGPP__) + int _rl_completion_case_fold = 1; + #else +-int _rl_completion_case_fold; ++int _rl_completion_case_fold = 0; + #endif + +-/* If non-zero, don't match hidden files (filenames beginning with a `.' on ++/* Non-zero means that `-' and `_' are equivalent when comparing filenames ++ for completion. */ ++int _rl_completion_case_map = 0; ++ ++/* If zero, don't match hidden files (filenames beginning with a `.' on + Unix) when doing filename completion. */ + int _rl_match_hidden_files = 1; + ++/* Length in characters of a common prefix replaced with an ellipsis (`...') ++ when displaying completion matches. Matches whose printable portion has ++ more than this number of displaying characters in common will have the common ++ display prefix replaced with an ellipsis. */ ++int _rl_completion_prefix_display_length = 0; ++ ++/* The readline-private number of screen columns to use when displaying ++ matches. If < 0 or > _rl_screenwidth, it is ignored. */ ++int _rl_completion_columns = -1; ++ + /* Global variables available to applications using readline. */ + + #if defined (VISIBLE_STATS) +@@ -173,6 +189,16 @@ int _rl_match_hidden_files = 1; + int rl_visible_stats = 0; + #endif /* VISIBLE_STATS */ + ++/* If non-zero, when completing in the middle of a word, don't insert ++ characters from the match that match characters following point in ++ the word. This means, for instance, completing when the cursor is ++ after the `e' in `Makefile' won't result in `Makefilefile'. */ ++int _rl_skip_completed_text = 0; ++ ++/* If non-zero, menu completion displays the common prefix first in the ++ cycle of possible completions instead of the last. */ ++int _rl_menu_complete_prefix_first = 0; ++ + /* If non-zero, then this is the address of a function to call when + completing on a directory name. The function is called with + the address of a string (the current directory name) as an arg. */ +@@ -180,6 +206,17 @@ rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL; + + rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL; + ++/* If non-zero, this is the address of a function to call when reading ++ directory entries from the filesystem for completion and comparing ++ them to the partial word to be completed. The function should ++ either return its first argument (if no conversion takes place) or ++ newly-allocated memory. This can, for instance, convert filenames ++ between character sets for comparison against what's typed at the ++ keyboard. The returned value is what is added to the list of ++ matches. The second argument is the length of the filename to be ++ converted. */ ++rl_dequote_func_t *rl_filename_rewrite_hook = (rl_dequote_func_t *)NULL; ++ + /* Non-zero means readline completion functions perform tilde expansion. */ + int rl_complete_with_tilde_expansion = 0; + +@@ -188,6 +225,10 @@ int rl_complete_with_tilde_expansion = 0; + completer. */ + rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)NULL; + ++/* Pointer to generator function for rl_menu_complete (). NULL means to use ++ *rl_completion_entry_function (see above). */ ++rl_compentry_func_t *rl_menu_completion_entry_function = (rl_compentry_func_t *)NULL; ++ + /* Pointer to alternative function to create matches. + Function is called with TEXT, START, and END. + START and END are indices in RL_LINE_BUFFER saying what the boundaries +@@ -325,11 +366,20 @@ int rl_completion_mark_symlink_dirs; + /* If non-zero, inhibit completion (temporarily). */ + int rl_inhibit_completion; + ++/* Set to the last key used to invoke one of the completion functions */ ++int rl_completion_invoking_key; ++ ++/* If non-zero, sort the completion matches. On by default. */ ++int rl_sort_completion_matches = 1; ++ + /* Variables local to this file. */ + + /* Local variable states what happened during the last completion attempt. */ + static int completion_changed_buffer; + ++/* The result of the query to the user about displaying completion matches */ ++static int completion_y_or_n; ++ + /*************************************/ + /* */ + /* Bindable completion functions */ +@@ -343,6 +393,8 @@ int + rl_complete (ignore, invoking_key) + int ignore, invoking_key; + { ++ rl_completion_invoking_key = invoking_key; ++ + if (rl_inhibit_completion) + return (_rl_insert_char (ignore, invoking_key)); + else if (rl_last_func == rl_complete && !completion_changed_buffer) +@@ -360,6 +412,7 @@ int + rl_possible_completions (ignore, invoking_key) + int ignore, invoking_key; + { ++ rl_completion_invoking_key = invoking_key; + return (rl_complete_internal ('?')); + } + +@@ -367,6 +420,7 @@ int + rl_insert_completions (ignore, invoking_key) + int ignore, invoking_key; + { ++ rl_completion_invoking_key = invoking_key; + return (rl_complete_internal ('*')); + } + +@@ -395,6 +449,14 @@ rl_completion_mode (cfunc) + /* */ + /************************************/ + ++/* Reset readline state on a signal or other event. */ ++void ++_rl_reset_completion_state () ++{ ++ rl_completion_found_quote = 0; ++ rl_completion_quote_character = 0; ++} ++ + /* Set default values for readline word completion. These are the variables + that application completion functions can change or inspect. */ + static void +@@ -406,6 +468,7 @@ set_completion_defaults (what_to_do) + rl_filename_quoting_desired = 1; + rl_completion_type = what_to_do; + rl_completion_suppress_append = rl_completion_suppress_quote = 0; ++ rl_completion_append_character = ' '; + + /* The completion entry function may optionally change this. */ + rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs; +@@ -418,6 +481,19 @@ get_y_or_n (for_pager) + { + int c; + ++/* Disabled for GDB due to the gdb.base/readline-ask.exp regression. ++ [patch] testsuite: Test readline-6.2 "ask" regression ++ http://sourceware.org/ml/gdb-patches/2011-05/msg00002.html */ ++#if 0 ++ /* For now, disable pager in callback mode, until we later convert to state ++ driven functions. Have to wait until next major version to add new ++ state definition, since it will change value of RL_STATE_DONE. */ ++#if defined (READLINE_CALLBACKS) ++ if (RL_ISSTATE (RL_STATE_CALLBACK)) ++ return 1; ++#endif ++#endif ++ + for (;;) + { + RL_SETSTATE(RL_STATE_MOREINPUT); +@@ -428,7 +504,7 @@ get_y_or_n (for_pager) + return (1); + if (c == 'n' || c == 'N' || c == RUBOUT) + return (0); +- if (c == ABORT_CHAR) ++ if (c == ABORT_CHAR || c < 0) + _rl_abort_internal (); + if (for_pager && (c == NEWLINE || c == RETURN)) + return (2); +@@ -481,6 +557,13 @@ stat_char (filename) + struct stat finfo; + int character, r; + ++ /* Short-circuit a //server on cygwin, since that will always behave as ++ a directory. */ ++#if __CYGWIN__ ++ if (filename[0] == '/' && filename[1] == '/' && strchr (filename+2, '/') == 0) ++ return '/'; ++#endif ++ + #if defined (HAVE_LSTAT) && defined (S_ISLNK) + r = lstat (filename, &finfo); + #else +@@ -581,7 +664,7 @@ fnwidth (string) + width = pos = 0; + while (string[pos]) + { +- if (CTRL_CHAR (*string) || *string == RUBOUT) ++ if (CTRL_CHAR (string[pos]) || string[pos] == RUBOUT) + { + width += 2; + pos++; +@@ -614,17 +697,20 @@ fnwidth (string) + return width; + } + ++#define ELLIPSIS_LEN 3 ++ + static int +-fnprint (to_print) ++fnprint (to_print, prefix_bytes) + const char *to_print; ++ int prefix_bytes; + { +- int printed_len; ++ int printed_len, w; + const char *s; + #if defined (HANDLE_MULTIBYTE) + mbstate_t ps; + const char *end; + size_t tlen; +- int width, w; ++ int width; + wchar_t wc; + + end = to_print + strlen (to_print) + 1; +@@ -632,7 +718,23 @@ fnprint (to_print) + #endif + + printed_len = 0; +- s = to_print; ++ ++ /* Don't print only the ellipsis if the common prefix is one of the ++ possible completions */ ++ if (to_print[prefix_bytes] == '\0') ++ prefix_bytes = 0; ++ ++ if (prefix_bytes) ++ { ++ char ellipsis; ++ ++ ellipsis = (to_print[prefix_bytes] == '.') ? '_' : '.'; ++ for (w = 0; w < ELLIPSIS_LEN; w++) ++ putc (ellipsis, rl_outstream); ++ printed_len = ELLIPSIS_LEN; ++ } ++ ++ s = to_print + prefix_bytes; + while (*s) + { + if (CTRL_CHAR (*s)) +@@ -691,14 +793,15 @@ fnprint (to_print) + filenames. Return the number of characters we output. */ + + static int +-print_filename (to_print, full_pathname) ++print_filename (to_print, full_pathname, prefix_bytes) + char *to_print, *full_pathname; ++ int prefix_bytes; + { + int printed_len, extension_char, slen, tlen; + char *s, c, *new_full_pathname, *dn; + + extension_char = 0; +- printed_len = fnprint (to_print); ++ printed_len = fnprint (to_print, prefix_bytes); + + #if defined (VISIBLE_STATS) + if (rl_filename_completion_desired && (rl_visible_stats || _rl_complete_mark_directories)) +@@ -753,7 +856,7 @@ print_filename (to_print, full_pathname) + if (path_isdir (new_full_pathname)) + extension_char = '/'; + +- free (new_full_pathname); ++ xfree (new_full_pathname); + to_print[-1] = c; + } + else +@@ -768,7 +871,7 @@ print_filename (to_print, full_pathname) + extension_char = '/'; + } + +- free (s); ++ xfree (s); + if (extension_char) + { + putc (extension_char, rl_outstream); +@@ -950,7 +1053,7 @@ gen_completion_matches (text, start, end, our_func, found_quote, quote_char) + rl_compentry_func_t *our_func; + int found_quote, quote_char; + { +- char **matches, *temp; ++ char **matches; + + rl_completion_found_quote = found_quote; + rl_completion_quote_character = quote_char; +@@ -960,7 +1063,10 @@ gen_completion_matches (text, start, end, our_func, found_quote, quote_char) + variable rl_attempted_completion_function. */ + if (rl_attempted_completion_function) + { ++ _rl_interrupt_immediately++; + matches = (*rl_attempted_completion_function) (text, start, end); ++ if (_rl_interrupt_immediately > 0) ++ _rl_interrupt_immediately--; + + if (matches || rl_attempted_completion_over) + { +@@ -969,21 +1075,9 @@ gen_completion_matches (text, start, end, our_func, found_quote, quote_char) + } + } + +- /* Beware -- we're stripping the quotes here. Do this only if we know +- we are doing filename completion and the application has defined a +- filename dequoting function. */ +- temp = (char *)NULL; +- +- if (found_quote && our_func == rl_filename_completion_function && +- rl_filename_dequoting_function) +- { +- /* delete single and double quotes */ +- temp = (*rl_filename_dequoting_function) (text, quote_char); +- text = temp; /* not freeing text is not a memory leak */ +- } ++ /* XXX -- filename dequoting moved into rl_filename_completion_function */ + + matches = rl_completion_matches (text, our_func); +- FREE (temp); + return matches; + } + +@@ -1004,7 +1098,7 @@ remove_duplicate_matches (matches) + + /* Sort the array without matches[0], since we need it to + stay in place no matter what. */ +- if (i) ++ if (i && rl_sort_completion_matches) + qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); + + /* Remember the lowest common denominator for it may be unique. */ +@@ -1014,7 +1108,7 @@ remove_duplicate_matches (matches) + { + if (strcmp (matches[i], matches[i + 1]) == 0) + { +- free (matches[i]); ++ xfree (matches[i]); + matches[i] = (char *)&dead_slot; + } + else +@@ -1032,7 +1126,7 @@ remove_duplicate_matches (matches) + temp_array[j] = (char *)NULL; + + if (matches[0] != (char *)&dead_slot) +- free (matches[0]); ++ xfree (matches[0]); + + /* Place the lowest common denominator back in [0]. */ + temp_array[0] = lowest_common; +@@ -1042,7 +1136,7 @@ remove_duplicate_matches (matches) + insert. */ + if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0) + { +- free (temp_array[1]); ++ xfree (temp_array[1]); + temp_array[1] = (char *)NULL; + } + return (temp_array); +@@ -1116,7 +1210,8 @@ compute_lcd_of_matches (match_list, matches, text) + #if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { +- mbstate_t ps_back = ps1; ++ mbstate_t ps_back; ++ ps_back = ps1; + if (!_rl_compare_chars (match_list[i], si, &ps1, match_list[i+1], si, &ps2)) + break; + else if ((v = _rl_get_char_len (&match_list[i][si], &ps_back)) > 1) +@@ -1220,7 +1315,7 @@ postprocess_matches (matchesp, matching_filenames) + if (rl_ignore_completion_duplicates) + { + temp_matches = remove_duplicate_matches (matches); +- free (matches); ++ xfree (matches); + matches = temp_matches; + } + +@@ -1257,6 +1352,23 @@ postprocess_matches (matchesp, matching_filenames) + return (1); + } + ++static int ++complete_get_screenwidth () ++{ ++ int cols; ++ char *envcols; ++ ++ cols = _rl_completion_columns; ++ if (cols >= 0 && cols <= _rl_screenwidth) ++ return cols; ++ envcols = getenv ("COLUMNS"); ++ if (envcols && *envcols) ++ cols = atoi (envcols); ++ if (cols >= 0 && cols <= _rl_screenwidth) ++ return cols; ++ return _rl_screenwidth; ++} ++ + /* A convenience function for displaying a list of strings in + columnar format on readline's output stream. MATCHES is the list + of strings, in argv format, LEN is the number of strings in MATCHES, +@@ -1266,17 +1378,38 @@ rl_display_match_list (matches, len, max) + char **matches; + int len, max; + { +- int count, limit, printed_len, lines; +- int i, j, k, l; +- char *temp; ++ int count, limit, printed_len, lines, cols; ++ int i, j, k, l, common_length, sind; ++ char *temp, *t; ++ ++ /* Find the length of the prefix common to all items: length as displayed ++ characters (common_length) and as a byte index into the matches (sind) */ ++ common_length = sind = 0; ++ if (_rl_completion_prefix_display_length > 0) ++ { ++ t = printable_part (matches[0]); ++ temp = strrchr (t, '/'); ++ common_length = temp ? fnwidth (temp) : fnwidth (t); ++ sind = temp ? strlen (temp) : strlen (t); ++ ++ if (common_length > _rl_completion_prefix_display_length && common_length > ELLIPSIS_LEN) ++ max -= common_length - ELLIPSIS_LEN; ++ else ++ common_length = sind = 0; ++ } + + /* How many items of MAX length can we fit in the screen window? */ ++ cols = complete_get_screenwidth (); + max += 2; +- limit = _rl_screenwidth / max; +- if (limit != 1 && (limit * max == _rl_screenwidth)) ++ limit = cols / max; ++ if (limit != 1 && (limit * max == cols)) + limit--; + +- /* Avoid a possible floating exception. If max > _rl_screenwidth, ++ /* If cols == 0, limit will end up -1 */ ++ if (cols < _rl_screenwidth && limit < 0) ++ limit = 1; ++ ++ /* Avoid a possible floating exception. If max > cols, + limit will be 0 and a divide-by-zero fault will result. */ + if (limit == 0) + limit = 1; +@@ -1289,7 +1422,7 @@ rl_display_match_list (matches, len, max) + 0 < len <= limit implies count = 1. */ + + /* Sort the items if they are not already sorted. */ +- if (rl_ignore_completion_duplicates == 0) ++ if (rl_ignore_completion_duplicates == 0 && rl_sort_completion_matches) + qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare); + + rl_crlf (); +@@ -1307,7 +1440,7 @@ rl_display_match_list (matches, len, max) + else + { + temp = printable_part (matches[l]); +- printed_len = print_filename (temp, matches[l]); ++ printed_len = print_filename (temp, matches[l], sind); + + if (j + 1 < limit) + for (k = 0; k < max - printed_len; k++) +@@ -1331,7 +1464,7 @@ rl_display_match_list (matches, len, max) + for (i = 1; matches[i]; i++) + { + temp = printable_part (matches[i]); +- printed_len = print_filename (temp, matches[i]); ++ printed_len = print_filename (temp, matches[i], sind); + /* Have we reached the end of this line? */ + if (matches[i+1]) + { +@@ -1381,7 +1514,7 @@ display_matches (matches) + { + temp = printable_part (matches[0]); + rl_crlf (); +- print_filename (temp, matches[0]); ++ print_filename (temp, matches[0], 0); + rl_crlf (); + + rl_forced_update_display (); +@@ -1417,7 +1550,7 @@ display_matches (matches) + rl_crlf (); + fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len); + fflush (rl_outstream); +- if (get_y_or_n (0) == 0) ++ if ((completion_y_or_n = get_y_or_n (0)) == 0) + { + rl_crlf (); + +@@ -1485,8 +1618,9 @@ insert_match (match, start, mtype, qc) + int start, mtype; + char *qc; + { +- char *replacement; ++ char *replacement, *r; + char oqc; ++ int end, rlen; + + oqc = qc ? *qc : '\0'; + replacement = make_quoted_replacement (match, mtype, qc); +@@ -1494,6 +1628,7 @@ insert_match (match, start, mtype, qc) + /* Now insert the match. */ + if (replacement) + { ++ rlen = strlen (replacement); + /* Don't double an opening quote character. */ + if (qc && *qc && start && rl_line_buffer[start - 1] == *qc && + replacement[0] == *qc) +@@ -1503,9 +1638,26 @@ insert_match (match, start, mtype, qc) + else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc && + replacement[0] != oqc) + start--; +- _rl_replace_text (replacement, start, rl_point - 1); ++ end = rl_point - 1; ++ /* Don't double a closing quote character */ ++ if (qc && *qc && end && rl_line_buffer[rl_point] == *qc && replacement[rlen - 1] == *qc) ++ end++; ++ if (_rl_skip_completed_text) ++ { ++ r = replacement; ++ while (start < rl_end && *r && rl_line_buffer[start] == *r) ++ { ++ start++; ++ r++; ++ } ++ if (start <= end || *r) ++ _rl_replace_text (r, start, end); ++ rl_point = start + strlen (r); ++ } ++ else ++ _rl_replace_text (replacement, start, end); + if (replacement != match) +- free (replacement); ++ xfree (replacement); + } + } + +@@ -1572,7 +1724,7 @@ append_to_match (text, delimiter, quote_char, nontrivial_match) + if (rl_point == rl_end && temp_string_index) + rl_insert_text (temp_string); + } +- free (filename); ++ xfree (filename); + } + else + { +@@ -1608,7 +1760,7 @@ insert_all_matches (matches, point, qc) + rl_insert_text (rp); + rl_insert_text (" "); + if (rp != matches[i]) +- free (rp); ++ xfree (rp); + } + } + else +@@ -1617,7 +1769,7 @@ insert_all_matches (matches, point, qc) + rl_insert_text (rp); + rl_insert_text (" "); + if (rp != matches[0]) +- free (rp); ++ xfree (rp); + } + rl_end_undo_group (); + } +@@ -1632,8 +1784,8 @@ _rl_free_match_list (matches) + return; + + for (i = 0; matches[i]; i++) +- free (matches[i]); +- free (matches); ++ xfree (matches[i]); ++ xfree (matches); + } + + /* Complete the word at or before point. +@@ -1654,6 +1806,9 @@ rl_complete_internal (what_to_do) + int start, end, delimiter, found_quote, i, nontrivial_lcd; + char *text, *saved_line_buffer; + char quote_char; ++#if 1 ++ int tlen, mlen; ++#endif + + RL_SETSTATE(RL_STATE_COMPLETING); + +@@ -1681,7 +1836,11 @@ rl_complete_internal (what_to_do) + /* nontrivial_lcd is set if the common prefix adds something to the word + being completed. */ + nontrivial_lcd = matches && strcmp (text, matches[0]) != 0; +- free (text); ++#if 1 ++ if (what_to_do == '!' || what_to_do == '@') ++ tlen = strlen (text); ++#endif ++ xfree (text); + + if (matches == 0) + { +@@ -1689,6 +1848,7 @@ rl_complete_internal (what_to_do) + FREE (saved_line_buffer); + completion_changed_buffer = 0; + RL_UNSETSTATE(RL_STATE_COMPLETING); ++ _rl_reset_completion_state (); + return (0); + } + +@@ -1703,6 +1863,7 @@ rl_complete_internal (what_to_do) + FREE (saved_line_buffer); + completion_changed_buffer = 0; + RL_UNSETSTATE(RL_STATE_COMPLETING); ++ _rl_reset_completion_state (); + return (0); + } + +@@ -1712,8 +1873,25 @@ rl_complete_internal (what_to_do) + case '!': + case '@': + /* Insert the first match with proper quoting. */ ++#if 0 + if (*matches[0]) + insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); ++#else ++ if (what_to_do == TAB) ++ { ++ if (*matches[0]) ++ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); ++ } ++ else if (*matches[0] && matches[1] == 0) ++ /* should we perform the check only if there are multiple matches? */ ++ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); ++ else if (*matches[0]) /* what_to_do != TAB && multiple matches */ ++ { ++ mlen = *matches[0] ? strlen (matches[0]) : 0; ++ if (mlen >= tlen) ++ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); ++ } ++#endif + + /* If there are more matches, ring the bell to indicate. + If we are in vi mode, Posix.2 says to not ring the bell. +@@ -1753,10 +1931,11 @@ rl_complete_internal (what_to_do) + break; + + default: +- fprintf (stderr, "\r\nreadline: bad value %d for what_to_do in rl_complete\n", what_to_do); ++ _rl_ttymsg ("bad value %d for what_to_do in rl_complete", what_to_do); + rl_ding (); + FREE (saved_line_buffer); + RL_UNSETSTATE(RL_STATE_COMPLETING); ++ _rl_reset_completion_state (); + return 1; + } + +@@ -1766,10 +1945,11 @@ rl_complete_internal (what_to_do) + if (saved_line_buffer) + { + completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0; +- free (saved_line_buffer); ++ xfree (saved_line_buffer); + } + + RL_UNSETSTATE(RL_STATE_COMPLETING); ++ _rl_reset_completion_state (); + return 0; + } + +@@ -1813,6 +1993,7 @@ rl_completion_matches (text, entry_function) + match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *)); + match_list[1] = (char *)NULL; + ++ _rl_interrupt_immediately++; + while (string = (*entry_function) (text, matches)) + { + if (matches + 1 == match_list_size) +@@ -1822,6 +2003,8 @@ rl_completion_matches (text, entry_function) + match_list[++matches] = string; + match_list[matches + 1] = (char *)NULL; + } ++ if (_rl_interrupt_immediately > 0) ++ _rl_interrupt_immediately--; + + /* If there were any matches, then look through them finding out the + lowest common denominator. That then becomes match_list[0]. */ +@@ -1829,7 +2012,7 @@ rl_completion_matches (text, entry_function) + compute_lcd_of_matches (match_list, matches, text); + else /* There were no matches. */ + { +- free (match_list); ++ xfree (match_list); + match_list = (char **)NULL; + } + return (match_list); +@@ -1895,6 +2078,62 @@ rl_username_completion_function (text, state) + #endif /* !__WIN32__ && !__OPENNT */ + } + ++/* Return non-zero if CONVFN matches FILENAME up to the length of FILENAME ++ (FILENAME_LEN). If _rl_completion_case_fold is set, compare without ++ regard to the alphabetic case of characters. CONVFN is the possibly- ++ converted directory entry; FILENAME is what the user typed. */ ++static int ++complete_fncmp (convfn, convlen, filename, filename_len) ++ const char *convfn; ++ int convlen; ++ const char *filename; ++ int filename_len; ++{ ++ register char *s1, *s2; ++ int d, len; ++ ++ /* Otherwise, if these match up to the length of filename, then ++ it is a match. */ ++ if (_rl_completion_case_fold && _rl_completion_case_map) ++ { ++ /* Case-insensitive comparison treating _ and - as equivalent */ ++ if (filename_len == 0) ++ return 1; ++ if (convlen < filename_len) ++ return 0; ++ s1 = (char *)convfn; ++ s2 = (char *)filename; ++ len = filename_len; ++ 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 ((_rl_to_lower (convfn[0]) == _rl_to_lower (filename[0])) && ++ (convlen >= filename_len) && ++ (_rl_strnicmp (filename, convfn, filename_len) == 0)) ++ return 1; ++ } ++ else ++ { ++ if ((convfn[0] == filename[0]) && ++ (convlen >= filename_len) && ++ (strncmp (filename, convfn, filename_len) == 0)) ++ return 1; ++ } ++ return 0; ++} ++ + /* Okay, now we write the entry_function for filename completion. In the + general case. Note that completion in the shell is a little different + because of all the pathnames that must be followed when looking up the +@@ -1909,8 +2148,8 @@ rl_filename_completion_function (text, state) + static char *dirname = (char *)NULL; + static char *users_dirname = (char *)NULL; + static int filename_len; +- char *temp; +- int dirlen; ++ char *temp, *dentry, *convfn; ++ int dirlen, dentlen, convlen; + struct dirent *entry; + + /* If we don't have any state, then do some initialization. */ +@@ -1961,26 +2200,52 @@ rl_filename_completion_function (text, state) + + /* We aren't done yet. We also support the "~user" syntax. */ + +- /* Save the version of the directory that the user typed. */ +- users_dirname = savestring (dirname); ++ /* Save the version of the directory that the user typed, dequoting ++ it if necessary. */ ++ if (rl_completion_found_quote && rl_filename_dequoting_function) ++ users_dirname = (*rl_filename_dequoting_function) (dirname, rl_completion_quote_character); ++ else ++ users_dirname = savestring (dirname); + + if (*dirname == '~') + { + temp = tilde_expand (dirname); +- free (dirname); ++ xfree (dirname); + dirname = temp; + } + ++ /* We have saved the possibly-dequoted version of the directory name ++ the user typed. Now transform the directory name we're going to ++ pass to opendir(2). The directory rewrite hook modifies only the ++ directory name; the directory completion hook modifies both the ++ directory name passed to opendir(2) and the version the user ++ typed. Both the directory completion and rewrite hooks should perform ++ any necessary dequoting. The hook functions return 1 if they modify ++ the directory name argument. If either hook returns 0, it should ++ not modify the directory name pointer passed as an argument. */ + if (rl_directory_rewrite_hook) + (*rl_directory_rewrite_hook) (&dirname); +- +- if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname)) ++ else if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname)) + { +- free (users_dirname); ++ xfree (users_dirname); + users_dirname = savestring (dirname); + } +- ++ else if (rl_completion_found_quote && rl_filename_dequoting_function) ++ { ++ /* delete single and double quotes */ ++ xfree (dirname); ++ dirname = savestring (users_dirname); ++ } + directory = opendir (dirname); ++ ++ /* Now dequote a non-null filename. */ ++ if (filename && *filename && rl_completion_found_quote && rl_filename_dequoting_function) ++ { ++ /* delete single and double quotes */ ++ temp = (*rl_filename_dequoting_function) (filename, rl_completion_quote_character); ++ xfree (filename); ++ filename = temp; ++ } + filename_len = strlen (filename); + + rl_filename_completion_desired = 1; +@@ -1997,37 +2262,31 @@ rl_filename_completion_function (text, state) + entry = (struct dirent *)NULL; + while (directory && (entry = readdir (directory))) + { ++ convfn = dentry = entry->d_name; ++ convlen = dentlen = D_NAMLEN (entry); ++ ++ if (rl_filename_rewrite_hook) ++ { ++ convfn = (*rl_filename_rewrite_hook) (dentry, dentlen); ++ convlen = (convfn == dentry) ? dentlen : strlen (convfn); ++ } ++ + /* Special case for no filename. If the user has disabled the + `match-hidden-files' variable, skip filenames beginning with `.'. + All other entries except "." and ".." match. */ + if (filename_len == 0) + { +- if (_rl_match_hidden_files == 0 && HIDDEN_FILE (entry->d_name)) ++ if (_rl_match_hidden_files == 0 && HIDDEN_FILE (convfn)) + continue; + +- if (entry->d_name[0] != '.' || +- (entry->d_name[1] && +- (entry->d_name[1] != '.' || entry->d_name[2]))) ++ if (convfn[0] != '.' || ++ (convfn[1] && (convfn[1] != '.' || convfn[2]))) + break; + } + else + { +- /* Otherwise, if these match up to the length of filename, then +- it is a match. */ +- if (_rl_completion_case_fold) +- { +- if ((_rl_to_lower (entry->d_name[0]) == _rl_to_lower (filename[0])) && +- (((int)D_NAMLEN (entry)) >= filename_len) && +- (_rl_strnicmp (filename, entry->d_name, filename_len) == 0)) +- break; +- } +- else +- { +- if ((entry->d_name[0] == filename[0]) && +- (((int)D_NAMLEN (entry)) >= filename_len) && +- (strncmp (filename, entry->d_name, filename_len) == 0)) +- break; +- } ++ if (complete_fncmp (convfn, convlen, filename, filename_len)) ++ break; + } + } + +@@ -2040,17 +2299,17 @@ rl_filename_completion_function (text, state) + } + if (dirname) + { +- free (dirname); ++ xfree (dirname); + dirname = (char *)NULL; + } + if (filename) + { +- free (filename); ++ xfree (filename); + filename = (char *)NULL; + } + if (users_dirname) + { +- free (users_dirname); ++ xfree (users_dirname); + users_dirname = (char *)NULL; + } + +@@ -2084,27 +2343,30 @@ rl_filename_completion_function (text, state) + temp[dirlen++] = '/'; + } + +- strcpy (temp + dirlen, entry->d_name); ++ strcpy (temp + dirlen, convfn); + } + else +- temp = savestring (entry->d_name); ++ temp = savestring (convfn); ++ ++ if (convfn != dentry) ++ xfree (convfn); + + return (temp); + } + } + + /* An initial implementation of a menu completion function a la tcsh. The +- first time (if the last readline command was not rl_menu_complete), we ++ first time (if the last readline command was not rl_old_menu_complete), we + generate the list of matches. This code is very similar to the code in + rl_complete_internal -- there should be a way to combine the two. Then, + for each item in the list of matches, we insert the match in an undoable + fashion, with the appropriate character appended (this happens on the +- second and subsequent consecutive calls to rl_menu_complete). When we ++ second and subsequent consecutive calls to rl_old_menu_complete). When we + hit the end of the match list, we restore the original unmatched text, + ring the bell, and reset the counter to zero. */ + int +-rl_menu_complete (count, ignore) +- int count, ignore; ++rl_old_menu_complete (count, invoking_key) ++ int count, invoking_key; + { + rl_compentry_func_t *our_func; + int matching_filenames, found_quote; +@@ -2119,7 +2381,7 @@ rl_menu_complete (count, ignore) + + /* The first time through, we generate the list of matches and set things + up to insert them. */ +- if (rl_last_func != rl_menu_complete) ++ if (rl_last_func != rl_old_menu_complete) + { + /* Clean up from previous call, if any. */ + FREE (orig_text); +@@ -2129,10 +2391,16 @@ rl_menu_complete (count, ignore) + match_list_index = match_list_size = 0; + matches = (char **)NULL; + ++ rl_completion_invoking_key = invoking_key; ++ ++ RL_SETSTATE(RL_STATE_COMPLETING); ++ + /* Only the completion entry function can change these. */ + set_completion_defaults ('%'); + +- our_func = rl_completion_entry_function ++ our_func = rl_menu_completion_entry_function; ++ if (our_func == 0) ++ our_func = rl_completion_entry_function + ? rl_completion_entry_function + : rl_filename_completion_function; + +@@ -2160,19 +2428,25 @@ rl_menu_complete (count, ignore) + + if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0) + { +- rl_ding (); ++ rl_ding (); + FREE (matches); + matches = (char **)0; + FREE (orig_text); + orig_text = (char *)0; +- completion_changed_buffer = 0; +- return (0); ++ completion_changed_buffer = 0; ++ RL_UNSETSTATE(RL_STATE_COMPLETING); ++ return (0); + } + ++ RL_UNSETSTATE(RL_STATE_COMPLETING); ++ + for (match_list_size = 0; matches[match_list_size]; match_list_size++) + ; + /* matches[0] is lcd if match_list_size > 1, but the circular buffer + code below should take care of it. */ ++ ++ if (match_list_size > 1 && _rl_complete_show_all) ++ display_matches (matches); + } + + /* Now we have the list of matches. Replace the text between +@@ -2190,7 +2464,10 @@ rl_menu_complete (count, ignore) + + match_list_index += count; + if (match_list_index < 0) +- match_list_index += match_list_size; ++ { ++ while (match_list_index < 0) ++ match_list_index += match_list_size; ++ } + else + match_list_index %= match_list_size; + +@@ -2209,3 +2486,180 @@ rl_menu_complete (count, ignore) + completion_changed_buffer = 1; + return (0); + } ++ ++int ++rl_menu_complete (count, ignore) ++ int count, ignore; ++{ ++ rl_compentry_func_t *our_func; ++ int matching_filenames, found_quote; ++ ++ static char *orig_text; ++ static char **matches = (char **)0; ++ static int match_list_index = 0; ++ static int match_list_size = 0; ++ static int nontrivial_lcd = 0; ++ static int full_completion = 0; /* set to 1 if menu completion should reinitialize on next call */ ++ static int orig_start, orig_end; ++ static char quote_char; ++ static int delimiter, cstate; ++ ++ /* The first time through, we generate the list of matches and set things ++ up to insert them. */ ++ if ((rl_last_func != rl_menu_complete && rl_last_func != rl_backward_menu_complete) || full_completion) ++ { ++ /* Clean up from previous call, if any. */ ++ FREE (orig_text); ++ if (matches) ++ _rl_free_match_list (matches); ++ ++ match_list_index = match_list_size = 0; ++ matches = (char **)NULL; ++ ++ full_completion = 0; ++ ++ RL_SETSTATE(RL_STATE_COMPLETING); ++ ++ /* Only the completion entry function can change these. */ ++ set_completion_defaults ('%'); ++ ++ our_func = rl_menu_completion_entry_function; ++ if (our_func == 0) ++ our_func = rl_completion_entry_function ++ ? rl_completion_entry_function ++ : rl_filename_completion_function; ++ ++ /* We now look backwards for the start of a filename/variable word. */ ++ orig_end = rl_point; ++ found_quote = delimiter = 0; ++ quote_char = '\0'; ++ ++ if (rl_point) ++ /* This (possibly) changes rl_point. If it returns a non-zero char, ++ we know we have an open quote. */ ++ quote_char = _rl_find_completion_word (&found_quote, &delimiter); ++ ++ orig_start = rl_point; ++ rl_point = orig_end; ++ ++ orig_text = rl_copy_text (orig_start, orig_end); ++ matches = gen_completion_matches (orig_text, orig_start, orig_end, ++ our_func, found_quote, quote_char); ++ ++ nontrivial_lcd = matches && strcmp (orig_text, matches[0]) != 0; ++ ++ /* If we are matching filenames, the attempted completion function will ++ have set rl_filename_completion_desired to a non-zero value. The basic ++ rl_filename_completion_function does this. */ ++ matching_filenames = rl_filename_completion_desired; ++ ++ if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0) ++ { ++ rl_ding (); ++ FREE (matches); ++ matches = (char **)0; ++ FREE (orig_text); ++ orig_text = (char *)0; ++ completion_changed_buffer = 0; ++ RL_UNSETSTATE(RL_STATE_COMPLETING); ++ return (0); ++ } ++ ++ RL_UNSETSTATE(RL_STATE_COMPLETING); ++ ++ for (match_list_size = 0; matches[match_list_size]; match_list_size++) ++ ; ++ ++ if (match_list_size == 0) ++ { ++ rl_ding (); ++ FREE (matches); ++ matches = (char **)0; ++ match_list_index = 0; ++ completion_changed_buffer = 0; ++ return (0); ++ } ++ ++ /* matches[0] is lcd if match_list_size > 1, but the circular buffer ++ code below should take care of it. */ ++ if (*matches[0]) ++ { ++ insert_match (matches[0], orig_start, matches[1] ? MULT_MATCH : SINGLE_MATCH, "e_char); ++ orig_end = orig_start + strlen (matches[0]); ++ completion_changed_buffer = STREQ (orig_text, matches[0]) == 0; ++ } ++ ++ if (match_list_size > 1 && _rl_complete_show_all) ++ { ++ display_matches (matches); ++ /* If there are so many matches that the user has to be asked ++ whether or not he wants to see the matches, menu completion ++ is unwieldy. */ ++ if (rl_completion_query_items > 0 && match_list_size >= rl_completion_query_items) ++ { ++ rl_ding (); ++ FREE (matches); ++ matches = (char **)0; ++ full_completion = 1; ++ return (0); ++ } ++ } ++ else if (match_list_size <= 1) ++ { ++ append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd); ++ full_completion = 1; ++ return (0); ++ } ++ else if (_rl_menu_complete_prefix_first && match_list_size > 1) ++ { ++ rl_ding (); ++ return (0); ++ } ++ } ++ ++ /* Now we have the list of matches. Replace the text between ++ rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with ++ matches[match_list_index], and add any necessary closing char. */ ++ ++ if (matches == 0 || match_list_size == 0) ++ { ++ rl_ding (); ++ FREE (matches); ++ matches = (char **)0; ++ completion_changed_buffer = 0; ++ return (0); ++ } ++ ++ match_list_index += count; ++ if (match_list_index < 0) ++ { ++ while (match_list_index < 0) ++ match_list_index += match_list_size; ++ } ++ else ++ match_list_index %= match_list_size; ++ ++ if (match_list_index == 0 && match_list_size > 1) ++ { ++ rl_ding (); ++ insert_match (matches[0], orig_start, MULT_MATCH, "e_char); ++ } ++ else ++ { ++ insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, "e_char); ++ append_to_match (matches[match_list_index], delimiter, quote_char, ++ strcmp (orig_text, matches[match_list_index])); ++ } ++ ++ completion_changed_buffer = 1; ++ return (0); ++} ++ ++int ++rl_backward_menu_complete (count, key) ++ int count, key; ++{ ++ /* Positive arguments to backward-menu-complete translate into negative ++ arguments for menu-complete, and vice versa. */ ++ return (rl_menu_complete (-count, key)); ++} +--- a/readline/config.h.in ++++ b/readline/config.h.in +@@ -4,6 +4,8 @@ + characters, even if the OS supports them. */ + #undef NO_MULTIBYTE_SUPPORT + ++#undef _FILE_OFFSET_BITS ++ + /* Define if on MINIX. */ + #undef _MINIX + +@@ -13,12 +15,16 @@ + #undef VOID_SIGHANDLER + + /* Characteristics of the compiler. */ +-#undef const ++#undef sig_atomic_t + + #undef size_t + + #undef ssize_t + ++#undef const ++ ++#undef volatile ++ + #undef PROTOTYPES + + #undef __CHAR_UNSIGNED__ +@@ -41,6 +47,15 @@ + /* Define if you have the isascii function. */ + #undef HAVE_ISASCII + ++/* Define if you have the iswctype function. */ ++#undef HAVE_ISWCTYPE ++ ++/* Define if you have the iswlower function. */ ++#undef HAVE_ISWLOWER ++ ++/* Define if you have the iswupper function. */ ++#undef HAVE_ISWUPPER ++ + /* Define if you have the isxdigit function. */ + #undef HAVE_ISXDIGIT + +@@ -88,11 +103,23 @@ + /* Define if you have the tcgetattr function. */ + #undef HAVE_TCGETATTR + ++/* Define if you have the towlower function. */ ++#undef HAVE_TOWLOWER ++ ++/* Define if you have the towupper function. */ ++#undef HAVE_TOWUPPER ++ + /* Define if you have the vsnprintf function. */ + #undef HAVE_VSNPRINTF + +-/* Define if you have the wctomb function. */ +-#undef HAVE_WCTOMB ++/* Define if you have the wcrtomb function. */ ++#undef HAVE_WCRTOMB ++ ++/* Define if you have the wcscoll function. */ ++#undef HAVE_WCSCOLL ++ ++/* Define if you have the wctype function. */ ++#undef HAVE_WCTYPE + + /* Define if you have the wcwidth function. */ + #undef HAVE_WCWIDTH +@@ -174,11 +201,20 @@ + /* Define if you have the header file. */ + #undef HAVE_WCHAR_H + +-/* Define if you have the header file. */ ++/* Define if you have the header file. */ + #undef HAVE_WCTYPE_H + + #undef HAVE_MBSTATE_T + ++/* Define if you have wchar_t in . */ ++#undef HAVE_WCHAR_T ++ ++/* Define if you have wctype_t in . */ ++#undef HAVE_WCTYPE_T ++ ++/* Define if you have wint_t in . */ ++#undef HAVE_WINT_T ++ + /* Define if you have and nl_langinfo(CODESET). */ + #undef HAVE_LANGINFO_CODESET + +@@ -223,10 +259,6 @@ + # define TERMIOS_MISSING + #endif + +-#if defined (STRCOLL_BROKEN) +-# undef HAVE_STRCOLL +-#endif +- + #if defined (__STDC__) && defined (HAVE_STDARG_H) + # define PREFER_STDARG + # define USE_VARARGS +--- a/readline/configure ++++ b/readline/configure +@@ -1,7 +1,7 @@ + #! /bin/sh +-# From configure.in for Readline 5.1, version 2.59. ++# From configure.in for Readline 6.2, version 2.67. + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.64 for readline 5.1-release. ++# Generated by GNU Autoconf 2.64 for readline 6.2. + # + # Report bugs to . + # +@@ -550,8 +550,8 @@ MAKEFLAGS= + # Identity of this package. + PACKAGE_NAME='readline' + PACKAGE_TARNAME='readline' +-PACKAGE_VERSION='5.1-release' +-PACKAGE_STRING='readline 5.1-release' ++PACKAGE_VERSION='6.2' ++PACKAGE_STRING='readline 6.2' + PACKAGE_BUGREPORT='bug-readline@gnu.org' + PACKAGE_URL='' + +@@ -593,7 +593,6 @@ ac_includes_default="\ + #endif" + + ac_subst_vars='LTLIBOBJS +-LIBOBJS + TERMCAP_LIB + LIBVERSION + ARFLAGS +@@ -623,14 +622,13 @@ SHOBJ_LDFLAGS + SHOBJ_LD + SHOBJ_CFLAGS + SHOBJ_CC +-WCWIDTH_OBJ ++LIBOBJS + MAKE_SHELL + RANLIB + AR + INSTALL_DATA + INSTALL_SCRIPT + INSTALL_PROGRAM +-CC_FOR_BUILD + EGREP + GREP + CPP +@@ -696,6 +694,7 @@ with_curses + with_purify + enable_multibyte + enable_static ++enable_largefile + ' + ac_precious_vars='build_alias + host_alias +@@ -1247,7 +1246,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 5.1-release to adapt to many kinds of systems. ++\`configure' configures readline 6.2 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1312,7 +1311,7 @@ fi + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of readline 5.1-release:";; ++ short | recursive ) echo "Configuration of readline 6.2:";; + esac + cat <<\_ACEOF + +@@ -1322,6 +1321,7 @@ Optional Features: + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-multibyte enable multibyte characters if OS supports them + --enable-static build static libraries [default=YES] ++ --disable-largefile omit support for large files + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +@@ -1406,7 +1406,7 @@ fi + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-readline configure 5.1-release ++readline configure 6.2 + generated by GNU Autoconf 2.64 + + Copyright (C) 2009 Free Software Foundation, Inc. +@@ -1831,7 +1831,7 @@ cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by readline $as_me 5.1-release, which was ++It was created by readline $as_me 6.2, which was + generated by GNU Autoconf 2.64. Invocation command line was + + $ $0 $@ +@@ -2211,7 +2211,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + ac_config_headers="$ac_config_headers config.h" + + +-LIBVERSION=5.1 ++LIBVERSION=6.2 + + # Make sure we can run config.sub. + $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +@@ -3622,39 +3622,6 @@ $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + + + +- +-if test "x$cross_compiling" = "xyes"; then +- case "${host}" in +- *-cygwin*) +- cross_cache=${srcdir}/cross-build/cygwin.cache +- LOCAL_CFLAGS="$LOCAL_CFLAGS -I${srcdir}/../libtermcap" +- ;; +- *-mingw32*) +- cross_cache=${srcdir}/cross-build/mingw.cache +- ;; +- *) echo "configure: cross-compiling for a non-cygwin target is not supported" >&2 +- ;; +- esac +- +- if test "x$cross_cache" != "x"; then +- if test -r "${cross_cache}"; then +- echo "loading cross-build cache file ${cross_cache}" +- . ${cross_cache} +- fi +- unset cross_cache +- fi +-fi +- +-if test -z "$CC_FOR_BUILD"; then +- if test "x$cross_compiling" = "xno"; then +- CC_FOR_BUILD='$(CC)' +- else +- CC_FOR_BUILD=gcc +- fi +-fi +- +- +- + # If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. + test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" + +@@ -4056,6 +4023,40 @@ if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then + + fi + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 ++$as_echo_n "checking for working volatile... " >&6; } ++if test "${ac_cv_c_volatile+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++volatile int x; ++int * volatile y = (int *) 0; ++return !x && !y; ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_c_volatile=yes ++else ++ ac_cv_c_volatile=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 ++$as_echo "$ac_cv_c_volatile" >&6; } ++if test $ac_cv_c_volatile = no; then ++ ++$as_echo "#define volatile /**/" >>confdefs.h ++ ++fi ++ + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 + $as_echo_n "checking return type of signal handlers... " >&6; } +@@ -4571,6 +4572,205 @@ fi + done + + ++# Check whether --enable-largefile was given. ++if test "${enable_largefile+set}" = set; then : ++ enableval=$enable_largefile; ++fi ++ ++if test "$enable_largefile" != no; then ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 ++$as_echo_n "checking for special C compiler options needed for large files... " >&6; } ++if test "${ac_cv_sys_largefile_CC+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_cv_sys_largefile_CC=no ++ if test "$GCC" != yes; then ++ ac_save_CC=$CC ++ while :; do ++ # IRIX 6.2 and later do not support large files by default, ++ # so use the C compiler's -n32 option if that helps. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ /* Check that off_t can represent 2**63 - 1 correctly. ++ We can't simply define LARGE_OFF_T to be 9223372036854775807, ++ since some C++ compilers masquerading as C compilers ++ incorrectly reject 9223372036854775807. */ ++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++ if ac_fn_c_try_compile "$LINENO"; then : ++ break ++fi ++rm -f core conftest.err conftest.$ac_objext ++ CC="$CC -n32" ++ if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_sys_largefile_CC=' -n32'; break ++fi ++rm -f core conftest.err conftest.$ac_objext ++ break ++ done ++ CC=$ac_save_CC ++ rm -f conftest.$ac_ext ++ fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 ++$as_echo "$ac_cv_sys_largefile_CC" >&6; } ++ if test "$ac_cv_sys_largefile_CC" != no; then ++ CC=$CC$ac_cv_sys_largefile_CC ++ fi ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 ++$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } ++if test "${ac_cv_sys_file_offset_bits+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ 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 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_sys_file_offset_bits=no; break ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$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 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ 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.$ac_ext ++ ac_cv_sys_file_offset_bits=unknown ++ break ++done ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 ++$as_echo "$ac_cv_sys_file_offset_bits" >&6; } ++case $ac_cv_sys_file_offset_bits in #( ++ no | unknown) ;; ++ *) ++cat >>confdefs.h <<_ACEOF ++#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits ++_ACEOF ++;; ++esac ++rm -rf conftest* ++ if test $ac_cv_sys_file_offset_bits = unknown; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 ++$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } ++if test "${ac_cv_sys_large_files+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ 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 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_sys_large_files=no; break ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$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 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_sys_large_files=1; break ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ ac_cv_sys_large_files=unknown ++ break ++done ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 ++$as_echo "$ac_cv_sys_large_files" >&6; } ++case $ac_cv_sys_large_files in #( ++ no | unknown) ;; ++ *) ++cat >>confdefs.h <<_ACEOF ++#define _LARGE_FILES $ac_cv_sys_large_files ++_ACEOF ++;; ++esac ++rm -rf conftest* ++ fi ++fi ++ ++ + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of signal functions" >&5 + $as_echo_n "checking for type of signal functions... " >&6; } +@@ -5078,6 +5278,49 @@ $as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h + fi + + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t in signal.h" >&5 ++$as_echo_n "checking for sig_atomic_t in signal.h... " >&6; } ++if test "${ac_cv_have_sig_atomic_t+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++#include ++ ++int ++main () ++{ ++ sig_atomic_t x; ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_have_sig_atomic_t=yes ++else ++ ac_cv_have_sig_atomic_t=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sig_atomic_t" >&5 ++$as_echo "$ac_cv_have_sig_atomic_t" >&6; } ++if test "$ac_cv_have_sig_atomic_t" = "no" ++then ++ ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "$ac_includes_default" ++if test "x$ac_cv_type_sig_atomic_t" = x""yes; then : ++ ++else ++ ++cat >>confdefs.h <<_ACEOF ++#define sig_atomic_t int ++_ACEOF ++ ++fi ++ ++fi ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether signal handlers are of type void" >&5 + $as_echo_n "checking whether signal handlers are of type void... " >&6; } + if test "${bash_cv_void_sighandler+set}" = set; then : +@@ -5116,6 +5359,7 @@ $as_echo "#define VOID_SIGHANDLER 1" >>confdefs.h + + fi + ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIOCSTAT in sys/ioctl.h" >&5 + $as_echo_n "checking for TIOCSTAT in sys/ioctl.h... " >&6; } + if test "${bash_cv_tiocstat_in_ioctl+set}" = set; then : +@@ -5638,27 +5882,73 @@ fi + done + + ++ac_fn_c_check_func "$LINENO" "mbrlen" "ac_cv_func_mbrlen" ++if test "x$ac_cv_func_mbrlen" = x""yes; then : ++ $as_echo "#define HAVE_MBRLEN 1" >>confdefs.h ++ ++fi ++ ++ac_fn_c_check_func "$LINENO" "mbscasecmp" "ac_cv_func_mbscasecmp" ++if test "x$ac_cv_func_mbscasecmp" = x""yes; then : ++ $as_echo "#define HAVE_MBSCMP 1" >>confdefs.h ++ ++fi ++ ++ac_fn_c_check_func "$LINENO" "mbscmp" "ac_cv_func_mbscmp" ++if test "x$ac_cv_func_mbscmp" = x""yes; then : ++ $as_echo "#define HAVE_MBSCMP 1" >>confdefs.h ++ ++fi ++ ++ac_fn_c_check_func "$LINENO" "mbsnrtowcs" "ac_cv_func_mbsnrtowcs" ++if test "x$ac_cv_func_mbsnrtowcs" = x""yes; then : ++ $as_echo "#define HAVE_MBSNRTOWCS 1" >>confdefs.h ++ ++fi ++ + ac_fn_c_check_func "$LINENO" "mbsrtowcs" "ac_cv_func_mbsrtowcs" + if test "x$ac_cv_func_mbsrtowcs" = x""yes; then : + $as_echo "#define HAVE_MBSRTOWCS 1" >>confdefs.h + + fi + +-ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc" +-if test "x$ac_cv_func_mbrtowc" = x""yes; then : +- $as_echo "#define HAVE_MBRTOWC 1" >>confdefs.h ++ ++ ++for ac_func in mbschr ++do : ++ ac_fn_c_check_func "$LINENO" "mbschr" "ac_cv_func_mbschr" ++if test "x$ac_cv_func_mbschr" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_MBSCHR 1 ++_ACEOF ++ ++else ++ case " $LIBOBJS " in ++ *" $ac_func.$ac_objext "* ) ;; ++ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ++ ;; ++esac + + fi ++done + +-ac_fn_c_check_func "$LINENO" "mbrlen" "ac_cv_func_mbrlen" +-if test "x$ac_cv_func_mbrlen" = x""yes; then : +- $as_echo "#define HAVE_MBRLEN 1" >>confdefs.h ++ ++ ++ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb" ++if test "x$ac_cv_func_wcrtomb" = x""yes; then : ++ $as_echo "#define HAVE_WCRTOMB 1" >>confdefs.h + + fi + +-ac_fn_c_check_func "$LINENO" "wctomb" "ac_cv_func_wctomb" +-if test "x$ac_cv_func_wctomb" = x""yes; then : +- $as_echo "#define HAVE_WCTOMB 1" >>confdefs.h ++ac_fn_c_check_func "$LINENO" "wcscoll" "ac_cv_func_wcscoll" ++if test "x$ac_cv_func_wcscoll" = x""yes; then : ++ $as_echo "#define HAVE_WCSCOLL 1" >>confdefs.h ++ ++fi ++ ++ac_fn_c_check_func "$LINENO" "wcsdup" "ac_cv_func_wcsdup" ++if test "x$ac_cv_func_wcsdup" = x""yes; then : ++ $as_echo "#define HAVE_WCSDUP 1" >>confdefs.h + + fi + +@@ -5668,55 +5958,89 @@ if test "x$ac_cv_func_wcwidth" = x""yes; then : + + fi + +-ac_fn_c_check_func "$LINENO" "wcsdup" "ac_cv_func_wcsdup" +-if test "x$ac_cv_func_wcsdup" = x""yes; then : +- $as_echo "#define HAVE_WCSDUP 1" >>confdefs.h ++ac_fn_c_check_func "$LINENO" "wctype" "ac_cv_func_wctype" ++if test "x$ac_cv_func_wctype" = x""yes; then : ++ $as_echo "#define HAVE_WCTYPE 1" >>confdefs.h + + fi + + +-if test "$ac_cv_func_wcwidth" = no && test "$ac_cv_header_wchar_h" = yes; then +- WCWIDTH_OBJ=wcwidth.o ++for ac_func in wcswidth ++do : ++ ac_fn_c_check_func "$LINENO" "wcswidth" "ac_cv_func_wcswidth" ++if test "x$ac_cv_func_wcswidth" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_WCSWIDTH 1 ++_ACEOF ++ + else +- WCWIDTH_OBJ= ++ case " $LIBOBJS " in ++ *" $ac_func.$ac_objext "* ) ;; ++ *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ++ ;; ++esac ++ + fi ++done ++ ++ + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5 +-$as_echo_n "checking for mbstate_t... " >&6; } +-if test "${bash_cv_have_mbstate_t+set}" = set; then : ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc and mbstate_t are properly declared" >&5 ++$as_echo_n "checking whether mbrtowc and mbstate_t are properly declared... " >&6; } ++if test "${ac_cv_func_mbrtowc+set}" = set; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +- + #include + int + main () + { +- +- mbstate_t ps; +- mbstate_t *psp; +- psp = (mbstate_t *)0; +- ++wchar_t wc; ++ char const s[] = ""; ++ size_t n = 1; ++ mbstate_t state; ++ return ! (sizeof state && (mbrtowc) (&wc, s, n, &state)); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- bash_cv_have_mbstate_t=yes ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_func_mbrtowc=yes + else +- bash_cv_have_mbstate_t=no ++ ac_cv_func_mbrtowc=no + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bash_cv_have_mbstate_t" >&5 +-$as_echo "$bash_cv_have_mbstate_t" >&6; } +-if test $bash_cv_have_mbstate_t = yes; then ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mbrtowc" >&5 ++$as_echo "$ac_cv_func_mbrtowc" >&6; } ++ if test $ac_cv_func_mbrtowc = yes; then ++ ++$as_echo "#define HAVE_MBRTOWC 1" >>confdefs.h ++ ++ fi ++ ++if test $ac_cv_func_mbrtowc = yes; then + $as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h + + fi + ++for ac_func in iswlower iswupper towlower towupper iswctype ++do : ++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ++ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" ++eval as_val=\$$as_ac_var ++ if test "x$as_val" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++done ++ ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 + $as_echo_n "checking for nl_langinfo and CODESET... " >&6; } + if test "${bash_cv_langinfo_codeset+set}" = set; then : +@@ -5748,6 +6072,126 @@ if test $bash_cv_langinfo_codeset = yes; then + + fi + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t in wchar.h" >&5 ++$as_echo_n "checking for wchar_t in wchar.h... " >&6; } ++if test "${bash_cv_type_wchar_t+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ ++int ++main () ++{ ++ ++ wchar_t foo; ++ foo = 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ bash_cv_type_wchar_t=yes ++else ++ bash_cv_type_wchar_t=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wchar_t" >&5 ++$as_echo "$bash_cv_type_wchar_t" >&6; } ++if test $bash_cv_type_wchar_t = yes; then ++ ++$as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wctype_t in wctype.h" >&5 ++$as_echo_n "checking for wctype_t in wctype.h... " >&6; } ++if test "${bash_cv_type_wctype_t+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++ ++ wctype_t foo; ++ foo = 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ bash_cv_type_wctype_t=yes ++else ++ bash_cv_type_wctype_t=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wctype_t" >&5 ++$as_echo "$bash_cv_type_wctype_t" >&6; } ++if test $bash_cv_type_wctype_t = yes; then ++ ++$as_echo "#define HAVE_WCTYPE_T 1" >>confdefs.h ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t in wctype.h" >&5 ++$as_echo_n "checking for wint_t in wctype.h... " >&6; } ++if test "${bash_cv_type_wint_t+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main () ++{ ++ ++ wint_t foo; ++ foo = 0; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ bash_cv_type_wint_t=yes ++else ++ bash_cv_type_wint_t=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bash_cv_type_wint_t" >&5 ++$as_echo "$bash_cv_type_wint_t" >&6; } ++if test $bash_cv_type_wint_t = yes; then ++ ++$as_echo "#define HAVE_WINT_T 1" >>confdefs.h ++ ++fi ++ ++if test "$am_cv_func_iconv" = yes; then ++ OLDLIBS="$LIBS" ++ LIBS="$LIBS $LIBICONV" ++ for ac_func in locale_charset ++do : ++ ac_fn_c_check_func "$LINENO" "locale_charset" "ac_cv_func_locale_charset" ++if test "x$ac_cv_func_locale_charset" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_LOCALE_CHARSET 1 ++_ACEOF ++ ++fi ++done ++ ++ LIBS="$OLDLIBS" ++fi ++ + + + case "$host_cpu" in +@@ -6357,7 +6801,7 @@ 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 5.1-release, which was ++This file was extended by readline $as_me 6.2, which was + generated by GNU Autoconf 2.64. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -6421,7 +6865,7 @@ Report bugs to ." + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_version="\\ +-readline config.status 5.1-release ++readline config.status 6.2 + configured by $0, generated by GNU Autoconf 2.64, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +--- a/readline/configure.in ++++ b/readline/configure.in +@@ -5,28 +5,26 @@ dnl report bugs to chet@po.cwru.edu + dnl + dnl Process this file with autoconf to produce a configure script. + +-# Copyright (C) 1987-2005 Free Software Foundation, Inc. ++# Copyright (C) 1987-2009 Free Software Foundation, Inc. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# 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. ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . + +-AC_REVISION([for Readline 5.1, version 2.59]) ++AC_REVISION([for Readline 6.2, version 2.67]) + + m4_include([../config/override.m4]) + +-AC_INIT(readline, 5.1-release, bug-readline@gnu.org) ++AC_INIT(readline, 6.2, bug-readline@gnu.org) + + dnl make sure we are using a recent autoconf version + AC_PREREQ(2.50) +@@ -38,7 +36,7 @@ AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/..) + AC_CONFIG_HEADERS(config.h) + + dnl update the value of RL_READLINE_VERSION in readline.h when this changes +-LIBVERSION=5.1 ++LIBVERSION=6.2 + + AC_CANONICAL_HOST + +@@ -115,44 +113,6 @@ AC_PROG_CC + dnl AC_AIX + AC_MINIX + +-dnl BEGIN changes for CYGNUS cross-building for Cygwin +-dnl NOTE: Some of these changes may no longer be necessary. +- +-dnl load up the cross-building cache file -- add more cases and cache +-dnl files as necessary +-if test "x$cross_compiling" = "xyes"; then +- case "${host}" in +- *-cygwin*) +- cross_cache=${srcdir}/cross-build/cygwin.cache +- LOCAL_CFLAGS="$LOCAL_CFLAGS -I${srcdir}/../libtermcap" +- ;; +- *-mingw32*) +- cross_cache=${srcdir}/cross-build/mingw.cache +- ;; +- *) echo "configure: cross-compiling for a non-cygwin target is not supported" >&2 +- ;; +- esac +- +- if test "x$cross_cache" != "x"; then +- if test -r "${cross_cache}"; then +- echo "loading cross-build cache file ${cross_cache}" +- . ${cross_cache} +- fi +- unset cross_cache +- fi +-fi +- +-if test -z "$CC_FOR_BUILD"; then +- if test "x$cross_compiling" = "xno"; then +- CC_FOR_BUILD='$(CC)' +- else +- CC_FOR_BUILD=gcc +- fi +-fi +-AC_SUBST(CC_FOR_BUILD) +- +-dnl END changes for CYGNUS cross-building for Cygwin +- + # If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. + test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" + +@@ -170,6 +130,7 @@ AC_SUBST(MAKE_SHELL) + AC_C_CONST + AC_C_PROTOTYPES + AC_C_CHAR_UNSIGNED ++AC_C_VOLATILE + + AC_TYPE_SIGNAL + +@@ -200,6 +161,8 @@ AC_CHECK_HEADERS(sys/ptem.h,,, + #endif + ]]) + ++AC_SYS_LARGEFILE ++ + BASH_SYS_SIGNAL_VINTAGE + BASH_SYS_REINSTALL_SIGHANDLERS + +@@ -212,7 +175,9 @@ BASH_CHECK_GETPW_FUNCS + + AC_HEADER_TIOCGWINSZ + ++BASH_TYPE_SIG_ATOMIC_T + BASH_TYPE_SIGHANDLER ++ + BASH_HAVE_TIOCSTAT + BASH_HAVE_FIONREAD + BASH_CHECK_SPEED_T +--- a/readline/display.c ++++ b/readline/display.c +@@ -1,24 +1,24 @@ + /* display.c -- readline redisplay facility. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -63,30 +63,59 @@ + extern char *strchr (), *strrchr (); + #endif /* !strchr && !__STDC__ */ + +-#if defined (HACK_TERMCAP_MOTION) +-extern char *_rl_term_forward_char; +-#endif +- + static void update_line PARAMS((char *, char *, int, int, int, int)); + static void space_to_eol PARAMS((int)); + static void delete_chars PARAMS((int)); + static void insert_some_chars PARAMS((char *, int, int)); + static void cr PARAMS((void)); + ++/* State of visible and invisible lines. */ ++struct line_state ++ { ++ char *line; ++ int *lbreaks; ++ int lbsize; + #if defined (HANDLE_MULTIBYTE) +-static int _rl_col_width PARAMS((const char *, int, int)); +-static int *_rl_wrapped_line; +-#else +-# define _rl_col_width(l, s, e) (((e) <= (s)) ? 0 : (e) - (s)) ++ int *wrapped_line; ++ int wbsize; + #endif ++ }; ++ ++/* The line display buffers. One is the line currently displayed on ++ the screen. The other is the line about to be displayed. */ ++static struct line_state line_state_array[2]; ++static struct line_state *line_state_visible = &line_state_array[0]; ++static struct line_state *line_state_invisible = &line_state_array[1]; ++static int line_structures_initialized = 0; + +-static int *inv_lbreaks, *vis_lbreaks; +-static int inv_lbsize, vis_lbsize; ++/* Backwards-compatible names. */ ++#define inv_lbreaks (line_state_invisible->lbreaks) ++#define inv_lbsize (line_state_invisible->lbsize) ++#define vis_lbreaks (line_state_visible->lbreaks) ++#define vis_lbsize (line_state_visible->lbsize) ++ ++#define visible_line (line_state_visible->line) ++#define invisible_line (line_state_invisible->line) ++ ++#if defined (HANDLE_MULTIBYTE) ++static int _rl_col_width PARAMS((const char *, int, int, int)); ++#else ++# define _rl_col_width(l, s, e, f) (((e) <= (s)) ? 0 : (e) - (s)) ++#endif + + /* Heuristic used to decide whether it is faster to move from CUR to NEW +- by backing up or outputting a carriage return and moving forward. */ ++ by backing up or outputting a carriage return and moving forward. CUR ++ and NEW are either both buffer positions or absolute screen positions. */ + #define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new))) + ++/* _rl_last_c_pos is an absolute cursor position in multibyte locales and a ++ buffer index in others. This macro is used when deciding whether the ++ current cursor position is in the middle of a prompt string containing ++ invisible characters. XXX - might need to take `modmark' into account. */ ++#define PROMPT_ENDING_INDEX \ ++ ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1) ++ ++ + /* **************************************************************** */ + /* */ + /* Display stuff */ +@@ -139,6 +168,8 @@ int _rl_last_c_pos = 0; + int _rl_last_v_pos = 0; + + static int cpos_adjusted; ++static int cpos_buffer_position; ++static int prompt_multibyte_chars; + + /* Number of lines currently on screen minus 1. */ + int _rl_vis_botlin = 0; +@@ -148,11 +179,6 @@ int _rl_vis_botlin = 0; + doing horizontal scrolling. It shifts in thirds of a screenwidth. */ + static int last_lmargin; + +-/* The line display buffers. One is the line currently displayed on +- the screen. The other is the line about to be displayed. */ +-static char *visible_line = (char *)NULL; +-static char *invisible_line = (char *)NULL; +- + /* A buffer for `modeline' messages. */ + static char msg_buf[128]; + +@@ -166,6 +192,7 @@ static int line_size = 1024; + include invisible characters. */ + + static char *local_prompt, *local_prompt_prefix; ++static int local_prompt_len; + static int prompt_visible_length, prompt_prefix_length; + + /* The number of invisible characters in the line currently being +@@ -192,6 +219,10 @@ static int prompt_last_screen_line; + + static int prompt_physical_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; ++ + /* Variables to save and restore prompt and display information. */ + + /* These are getting numerous enough that it's time to create a struct. */ +@@ -201,6 +232,7 @@ static char *saved_local_prefix; + static int saved_last_invisible; + static int saved_visible_length; + static int saved_prefix_length; ++static int saved_local_length; + static int saved_invis_chars_first_line; + static int saved_physical_chars; + +@@ -224,7 +256,7 @@ expand_prompt (pmt, lp, lip, niflp, vlp) + char *pmt; + int *lp, *lip, *niflp, *vlp; + { +- char *r, *ret, *p; ++ char *r, *ret, *p, *igstart; + int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars; + + /* Short-circuit if we can. */ +@@ -248,19 +280,21 @@ expand_prompt (pmt, lp, lip, niflp, vlp) + invfl = 0; /* invisible chars in first line of prompt */ + invflset = 0; /* we only want to set invfl once */ + ++ igstart = 0; + for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++) + { + /* This code strips the invisible character string markers + RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */ +- if (*p == RL_PROMPT_START_IGNORE) ++ if (ignoring == 0 && *p == RL_PROMPT_START_IGNORE) /* XXX - check ignoring? */ + { +- ignoring++; ++ ignoring = 1; ++ igstart = p; + continue; + } + else if (ignoring && *p == RL_PROMPT_END_IGNORE) + { + ignoring = 0; +- if (p[-1] != RL_PROMPT_START_IGNORE) ++ if (p != (igstart + 1)) + last = r - ret - 1; + continue; + } +@@ -276,8 +310,13 @@ expand_prompt (pmt, lp, lip, niflp, vlp) + *r++ = *p++; + if (!ignoring) + { ++ /* rl ends up being assigned to prompt_visible_length, ++ which is the number of characters in the buffer that ++ contribute to characters on the screen, which might ++ not be the same as the number of physical characters ++ on the screen in the presence of multibyte characters */ + rl += ind - pind; +- physchars += _rl_col_width (pmt, pind, ind); ++ physchars += _rl_col_width (pmt, pind, ind, 0); + } + else + ninvis += ind - pind; +@@ -360,6 +399,7 @@ rl_expand_prompt (prompt) + FREE (local_prompt_prefix); + + local_prompt = local_prompt_prefix = (char *)0; ++ local_prompt_len = 0; + prompt_last_invisible = prompt_invis_chars_first_line = 0; + prompt_visible_length = prompt_physical_chars = 0; + +@@ -375,6 +415,7 @@ rl_expand_prompt (prompt) + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)0; ++ local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + return (prompt_visible_length); + } + else +@@ -383,16 +424,17 @@ rl_expand_prompt (prompt) + t = ++p; + local_prompt = expand_prompt (p, &prompt_visible_length, + &prompt_last_invisible, +- (int *)NULL, ++ &prompt_invis_chars_first_line, + &prompt_physical_chars); + c = *t; *t = '\0'; + /* The portion of the prompt string up to and including the + final newline is now null-terminated. */ + local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length, + (int *)NULL, +- &prompt_invis_chars_first_line, ++ (int *)NULL, + (int *)NULL); + *t = c; ++ local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + return (prompt_prefix_length); + } + } +@@ -434,13 +476,21 @@ init_line_structures (minsize) + { + /* should be enough. */ + inv_lbsize = vis_lbsize = 256; +- inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int)); +- vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int)); ++ + #if defined (HANDLE_MULTIBYTE) +- _rl_wrapped_line = (int *)xmalloc (vis_lbsize * sizeof (int)); ++ line_state_visible->wbsize = vis_lbsize; ++ line_state_visible->wrapped_line = (int *)xmalloc (line_state_visible->wbsize * sizeof (int)); ++ ++ line_state_invisible->wbsize = inv_lbsize; ++ line_state_invisible->wrapped_line = (int *)xmalloc (line_state_invisible->wbsize * sizeof (int)); + #endif ++ ++ inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int)); ++ vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int)); + inv_lbreaks[0] = vis_lbreaks[0] = 0; + } ++ ++ line_structures_initialized = 1; + } + + /* Basic redisplay algorithm. */ +@@ -449,8 +499,8 @@ rl_redisplay () + { + register int in, out, c, linenum, cursor_linenum; + register char *line; +- int c_pos, inv_botlin, lb_botlin, lb_linenum, o_cpos; +- int newlines, lpos, temp, modmark, n0, num; ++ int inv_botlin, lb_botlin, lb_linenum, o_cpos; ++ int newlines, lpos, temp, n0, num, prompt_lines_estimate; + char *prompt_this_line; + #if defined (HANDLE_MULTIBYTE) + wchar_t wc; +@@ -460,24 +510,27 @@ rl_redisplay () + int _rl_wrapped_multicolumn = 0; + #endif + +- if (!readline_echoing_p) ++ if (_rl_echoing_p == 0) + return; + +- /* Signals are blocked through this function as the global data structures +- could get corrupted upon modifications from an invoked signal handler. */ +- _rl_block_sigint (); ++ /* Block keyboard interrupts because this function manipulates global ++ data structures. */ ++ _rl_block_sigint (); ++ RL_SETSTATE (RL_STATE_REDISPLAYING); + + if (!rl_display_prompt) + rl_display_prompt = ""; + +- if (invisible_line == 0 || vis_lbreaks == 0) ++ if (line_structures_initialized == 0) + { + init_line_structures (0); + rl_on_new_line (); + } + + /* Draw the line into the buffer. */ +- c_pos = -1; ++ cpos_buffer_position = -1; ++ ++ prompt_multibyte_chars = prompt_visible_length - prompt_physical_chars; + + line = invisible_line; + out = inv_botlin = 0; +@@ -504,24 +557,23 @@ rl_redisplay () + number of non-visible characters in the prompt string. */ + if (rl_display_prompt == rl_prompt || local_prompt) + { +- int local_len = local_prompt ? strlen (local_prompt) : 0; + if (local_prompt_prefix && forced_display) + _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix)); + +- if (local_len > 0) ++ if (local_prompt_len > 0) + { +- temp = local_len + out + 2; ++ temp = local_prompt_len + out + 2; + if (temp >= line_size) + { + line_size = (temp + 1024) - (temp % 1024); + visible_line = (char *)xrealloc (visible_line, line_size); + line = invisible_line = (char *)xrealloc (invisible_line, line_size); + } +- strncpy (line + out, local_prompt, local_len); +- out += local_len; ++ strncpy (line + out, local_prompt, local_prompt_len); ++ out += local_prompt_len; + } + line[out] = '\0'; +- wrap_offset = local_len - prompt_visible_length; ++ wrap_offset = local_prompt_len - prompt_visible_length; + } + else + { +@@ -576,10 +628,14 @@ rl_redisplay () + { \ + inv_lbsize *= 2; \ + inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ +- _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \ + } \ + inv_lbreaks[++newlines] = out; \ +- _rl_wrapped_line[newlines] = _rl_wrapped_multicolumn; \ ++ if (newlines >= (line_state_invisible->wbsize - 1)) \ ++ { \ ++ line_state_invisible->wbsize *= 2; \ ++ line_state_invisible->wrapped_line = (int *)xrealloc (line_state_invisible->wrapped_line, line_state_invisible->wbsize * sizeof(int)); \ ++ } \ ++ line_state_invisible->wrapped_line[newlines] = _rl_wrapped_multicolumn; \ + lpos = 0; \ + } \ + } while (0) +@@ -602,26 +658,26 @@ rl_redisplay () + + /* inv_lbreaks[i] is where line i starts in the buffer. */ + inv_lbreaks[newlines = 0] = 0; +-#if 0 +- lpos = out - wrap_offset; +-#else + lpos = prompt_physical_chars + modmark; +-#endif + + #if defined (HANDLE_MULTIBYTE) +- memset (_rl_wrapped_line, 0, vis_lbsize); ++ memset (line_state_invisible->wrapped_line, 0, line_state_invisible->wbsize * sizeof (int)); + num = 0; + #endif + + /* prompt_invis_chars_first_line is the number of invisible characters in + the first physical line of the prompt. + wrap_offset - prompt_invis_chars_first_line is the number of invis +- chars on the second line. */ ++ chars on the second (or, more generally, last) line. */ ++ ++ /* This is zero-based, used to set the newlines */ ++ prompt_lines_estimate = lpos / _rl_screenwidth; + + /* what if lpos is already >= _rl_screenwidth before we start drawing the + contents of the command line? */ + while (lpos >= _rl_screenwidth) + { ++ int z; + /* fix from Darin Johnson for prompt string with + invisible characters that is longer than the screen width. The + prompt_invis_chars_first_line variable could be made into an array +@@ -630,37 +686,48 @@ rl_redisplay () + prompts that exceed two physical lines? + Additional logic fix from Edward Catmur */ + #if defined (HANDLE_MULTIBYTE) +- n0 = num; +- temp = local_prompt ? strlen (local_prompt) : 0; +- while (num < temp) ++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0) + { +- if (_rl_col_width (local_prompt, n0, num) > _rl_screenwidth) ++ n0 = num; ++ temp = local_prompt_len; ++ while (num < temp) + { +- num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY); +- break; ++ z = _rl_col_width (local_prompt, n0, num, 1); ++ if (z > _rl_screenwidth) ++ { ++ num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY); ++ break; ++ } ++ else if (z == _rl_screenwidth) ++ break; ++ num++; + } +- num++; ++ temp = num; + } +- temp = num + +-#else +- temp = ((newlines + 1) * _rl_screenwidth) + ++ else + #endif /* !HANDLE_MULTIBYTE */ +- ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line +- : ((newlines == 1) ? wrap_offset : 0)) +- : ((newlines == 0) ? wrap_offset :0)); ++ temp = ((newlines + 1) * _rl_screenwidth); ++ ++ /* Now account for invisible characters in the current line. */ ++ /* XXX - this assumes that the invisible characters may be split, but only ++ between the first and the last lines. */ ++ temp += ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line ++ : ((newlines == prompt_lines_estimate) ? wrap_offset : prompt_invis_chars_first_line)) ++ : ((newlines == 0) ? wrap_offset : 0)); + + inv_lbreaks[++newlines] = temp; + #if defined (HANDLE_MULTIBYTE) +- lpos -= _rl_col_width (local_prompt, n0, num); +-#else +- lpos -= _rl_screenwidth; ++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0) ++ lpos -= _rl_col_width (local_prompt, n0, num, 1); ++ else + #endif ++ lpos -= _rl_screenwidth; + } + + prompt_last_screen_line = newlines; + + /* Draw the rest of the line (after the prompt) into invisible_line, keeping +- track of where the cursor is (c_pos), the number of the line containing ++ track of where the cursor is (cpos_buffer_position), the number of the line containing + the cursor (lb_linenum), the last line number (lb_botlin and inv_botlin). + It maintains an array of line breaks for display (inv_lbreaks). + This handles expanding tabs for display and displaying meta characters. */ +@@ -670,6 +737,7 @@ rl_redisplay () + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + memset (&ps, 0, sizeof (mbstate_t)); ++ /* XXX - what if wc_bytes ends up <= 0? check for MB_INVALIDCH */ + wc_bytes = mbrtowc (&wc, rl_line_buffer, rl_end, &ps); + } + else +@@ -713,7 +781,7 @@ rl_redisplay () + + if (in == rl_point) + { +- c_pos = out; ++ cpos_buffer_position = out; + lb_linenum = newlines; + } + +@@ -807,7 +875,7 @@ rl_redisplay () + } + if (in == rl_point) + { +- c_pos = out; ++ cpos_buffer_position = out; + lb_linenum = newlines; + } + for (i = in; i < in+wc_bytes; i++) +@@ -830,6 +898,7 @@ rl_redisplay () + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + in += wc_bytes; ++ /* XXX - what if wc_bytes ends up <= 0? check for MB_INVALIDCH */ + wc_bytes = mbrtowc (&wc, rl_line_buffer + in, rl_end - in, &ps); + } + else +@@ -838,9 +907,9 @@ rl_redisplay () + + } + line[out] = '\0'; +- if (c_pos < 0) ++ if (cpos_buffer_position < 0) + { +- c_pos = out; ++ cpos_buffer_position = out; + lb_linenum = newlines; + } + +@@ -849,7 +918,7 @@ rl_redisplay () + inv_lbreaks[newlines+1] = out; + cursor_linenum = lb_linenum; + +- /* C_POS == position in buffer where cursor should be placed. ++ /* CPOS_BUFFER_POSITION == position in buffer where cursor should be placed. + CURSOR_LINENUM == line number where the cursor should be placed. */ + + /* PWP: now is when things get a bit hairy. The visible and invisible +@@ -884,6 +953,10 @@ rl_redisplay () + 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]) +@@ -891,9 +964,16 @@ rl_redisplay () + #define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line) + #define INV_LINE(line) (invisible_line + 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) ++ + /* For each line in the buffer, do the updating display. */ + for (linenum = 0; linenum <= inv_botlin; linenum++) + { ++ /* This can lead us astray if we execute a program that changes ++ the locale from a non-multibyte to a multibyte one. */ + o_cpos = _rl_last_c_pos; + cpos_adjusted = 0; + update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum, +@@ -903,16 +983,22 @@ rl_redisplay () + take invisible characters into account, since _rl_last_c_pos + is an absolute cursor position in a multibyte locale. See + if compensating here is the right thing, or if we have to +- change update_line itself. There is one case in which ++ change update_line itself. There are several cases in which + update_line adjusts _rl_last_c_pos itself (so it can pass + _rl_move_cursor_relative accurate values); it communicates +- this back by setting cpos_adjusted */ +- if (linenum == 0 && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) && +- cpos_adjusted == 0 && +- _rl_last_c_pos != o_cpos && +- _rl_last_c_pos > wrap_offset && +- o_cpos < prompt_last_invisible) +- _rl_last_c_pos -= wrap_offset; ++ this back by setting cpos_adjusted. If we assume that ++ _rl_last_c_pos is correct (an absolute cursor position) each ++ time update_line is called, then we can assume in our ++ calculations that o_cpos does not need to be adjusted by ++ wrap_offset. */ ++ if (linenum == 0 && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) && OLD_CPOS_IN_PROMPT()) ++ _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */ ++ else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth && ++ (MB_CUR_MAX > 1 && rl_byte_oriented == 0) && ++ cpos_adjusted == 0 && ++ _rl_last_c_pos != o_cpos && ++ _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line)) ++ _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line); + + /* If this is the line with the prompt, we might need to + compensate for invisible characters in the new line. Do +@@ -932,6 +1018,19 @@ rl_redisplay () + if (nleft) + _rl_clear_to_eol (nleft); + } ++#if 0 ++ /* This segment is intended to handle the case where the prompt ++ has invisible characters on the second line and the new line ++ to be displayed needs to clear the rest of the old characters ++ out (e.g., when printing the i-search prompt). In general, ++ the case of the new line being shorter than the old. ++ Incomplete */ ++ else if (linenum == prompt_last_screen_line && ++ prompt_physical_chars > _rl_screenwidth && ++ wrap_offset != prompt_invis_chars_first_line && ++ _rl_last_c_pos == out && ++#endif ++ + + /* Since the new first line is now visible, save its length. */ + if (linenum == 0) +@@ -975,7 +1074,11 @@ rl_redisplay () + invisible character in the prompt string. */ + nleft = prompt_visible_length + wrap_offset; + if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 && +- _rl_last_c_pos <= prompt_last_invisible && local_prompt) ++#if 0 ++ _rl_last_c_pos <= PROMPT_ENDING_INDEX && local_prompt) ++#else ++ _rl_last_c_pos < PROMPT_ENDING_INDEX && local_prompt) ++#endif + { + #if defined (__MSDOS__) + putc ('\r', rl_outstream); +@@ -983,19 +1086,22 @@ rl_redisplay () + if (_rl_term_cr) + tputs (_rl_term_cr, 1, _rl_output_character_function); + #endif ++ 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) - wrap_offset; ++ _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft, 1) - wrap_offset + modmark; + else +- _rl_last_c_pos = nleft; ++ _rl_last_c_pos = nleft + modmark; + } + + /* Where on that line? And where does that line start + in the buffer? */ + pos = inv_lbreaks[cursor_linenum]; + /* nleft == number of characters in the line buffer between the +- start of the line and the cursor position. */ +- nleft = c_pos - pos; ++ start of the line and the desired cursor position. */ ++ nleft = cpos_buffer_position - pos; + + /* NLEFT is now a number of characters in a buffer. When in a + multibyte locale, however, _rl_last_c_pos is an absolute cursor +@@ -1007,11 +1113,12 @@ rl_redisplay () + those characters here and call _rl_backspace() directly. */ + if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos) + { ++ /* TX == new physical cursor position in multibyte locale. */ + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +- tx = _rl_col_width (&visible_line[pos], 0, nleft) - visible_wrap_offset; ++ tx = _rl_col_width (&visible_line[pos], 0, nleft, 1) - visible_wrap_offset; + else + tx = nleft; +- if (_rl_last_c_pos > tx) ++ if (tx >= 0 && _rl_last_c_pos > tx) + { + _rl_backspace (_rl_last_c_pos - tx); /* XXX */ + _rl_last_c_pos = tx; +@@ -1040,11 +1147,11 @@ rl_redisplay () + will be LMARGIN. */ + + /* The number of characters that will be displayed before the cursor. */ +- ndisp = c_pos - wrap_offset; ++ ndisp = cpos_buffer_position - wrap_offset; + nleft = prompt_visible_length + wrap_offset; + /* Where the new cursor position will be on the screen. This can be + longer than SCREENWIDTH; if it is, lmargin will be adjusted. */ +- phys_c_pos = c_pos - (last_lmargin ? last_lmargin : wrap_offset); ++ phys_c_pos = cpos_buffer_position - (last_lmargin ? last_lmargin : wrap_offset); + t = _rl_screenwidth / 3; + + /* If the number of characters had already exceeded the screenwidth, +@@ -1055,7 +1162,7 @@ rl_redisplay () + two-thirds of the way across the screen. */ + if (phys_c_pos > _rl_screenwidth - 2) + { +- lmargin = c_pos - (2 * t); ++ lmargin = cpos_buffer_position - (2 * t); + if (lmargin < 0) + lmargin = 0; + /* If the left margin would be in the middle of a prompt with +@@ -1069,7 +1176,7 @@ rl_redisplay () + { + /* If we are moving back towards the beginning of the line and + the last margin is no longer correct, compute a new one. */ +- lmargin = ((c_pos - 1) / t) * t; /* XXX */ ++ lmargin = ((cpos_buffer_position - 1) / t) * t; /* XXX */ + if (wrap_offset && lmargin > 0 && lmargin < nleft) + lmargin = nleft; + } +@@ -1089,9 +1196,11 @@ rl_redisplay () + if (t < out) + line[t - 1] = '>'; + +- if (!rl_display_fixed || forced_display || lmargin != last_lmargin) ++ if (rl_display_fixed == 0 || forced_display || lmargin != last_lmargin) + { + forced_display = 0; ++ o_cpos = _rl_last_c_pos; ++ cpos_adjusted = 0; + update_line (&visible_line[last_lmargin], + &invisible_line[lmargin], + 0, +@@ -1099,6 +1208,9 @@ rl_redisplay () + _rl_screenwidth + (lmargin ? 0 : wrap_offset), + 0); + ++ if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && OLD_CPOS_IN_PROMPT()) ++ _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */ ++ + /* If the visible new line is shorter than the old, but the number + of invisible characters is greater, and we are at the end of + the new line, we need to clear to eol. */ +@@ -1114,7 +1226,7 @@ rl_redisplay () + if (visible_first_line_len > _rl_screenwidth) + visible_first_line_len = _rl_screenwidth; + +- _rl_move_cursor_relative (c_pos - lmargin, &invisible_line[lmargin]); ++ _rl_move_cursor_relative (cpos_buffer_position - lmargin, &invisible_line[lmargin]); + last_lmargin = lmargin; + } + } +@@ -1122,17 +1234,10 @@ rl_redisplay () + + /* Swap visible and non-visible lines. */ + { +- char *vtemp = visible_line; +- int *itemp = vis_lbreaks, ntemp = vis_lbsize; +- +- visible_line = invisible_line; +- invisible_line = vtemp; ++ struct line_state *vtemp = line_state_visible; + +- vis_lbreaks = inv_lbreaks; +- inv_lbreaks = itemp; +- +- vis_lbsize = inv_lbsize; +- inv_lbsize = ntemp; ++ line_state_visible = line_state_invisible; ++ line_state_invisible = vtemp; + + rl_display_fixed = 0; + /* If we are displaying on a single line, and last_lmargin is > 0, we +@@ -1144,6 +1249,7 @@ rl_redisplay () + visible_wrap_offset = wrap_offset; + } + ++ RL_UNSETSTATE (RL_STATE_REDISPLAYING); + _rl_release_sigint (); + } + +@@ -1169,12 +1275,12 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + int current_line, omax, nmax, inv_botlin; + { + register char *ofd, *ols, *oe, *nfd, *nls, *ne; +- int temp, lendiff, wsatend, od, nd; ++ int temp, lendiff, wsatend, od, nd, twidth, o_cpos; + int current_invis_chars; + int col_lendiff, col_temp; + #if defined (HANDLE_MULTIBYTE) + mbstate_t ps_new, ps_old; +- int new_offset, old_offset, tmp; ++ int new_offset, old_offset; + #endif + + /* If we're at the right edge of a terminal that supports xn, we're +@@ -1185,7 +1291,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + temp = _rl_last_c_pos; + else +- temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset); ++ temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset); + if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode + && _rl_last_v_pos == current_line - 1) + { +@@ -1200,8 +1306,8 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + /* This fixes only double-column characters, but if the wrapped + character comsumes more than three columns, spaces will be + inserted in the string buffer. */ +- if (_rl_wrapped_line[current_line] > 0) +- _rl_clear_to_eol (_rl_wrapped_line[current_line]); ++ if (current_line < line_state_visible->wbsize && line_state_visible->wrapped_line[current_line] > 0) ++ _rl_clear_to_eol (line_state_visible->wrapped_line[current_line]); + + memset (&ps, 0, sizeof (mbstate_t)); + ret = mbrtowc (&wc, new, MB_CUR_MAX, &ps); +@@ -1217,7 +1323,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + + if (tempwidth > 0) + { +- int count; ++ int count, i; + bytes = ret; + for (count = 0; count < bytes; count++) + putc (new[count], rl_outstream); +@@ -1228,10 +1334,13 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + if (ret != 0 && bytes != 0) + { + if (MB_INVALIDCH (ret)) +- memmove (old+bytes, old+1, strlen (old+1)); +- else +- memmove (old+bytes, old+ret, strlen (old+ret)); ++ ret = 1; ++ memmove (old+bytes, old+ret, strlen (old+ret)); + memcpy (old, new, bytes); ++ /* Fix up indices if we copy data from one line to another */ ++ omax += bytes - ret; ++ for (i = current_line+1; i < inv_botlin+1; i++) ++ vis_lbreaks[i] += bytes - ret; + } + } + else +@@ -1265,7 +1374,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + /* See if the old line is a subset of the new line, so that the + only change is adding characters. */ + temp = (omax < nmax) ? omax : nmax; +- if (memcmp (old, new, temp) == 0) ++ if (memcmp (old, new, temp) == 0) /* adding at the end */ + { + ofd = old + temp; + nfd = new + temp; +@@ -1407,30 +1516,48 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + sequences (like drawing the `unbold' sequence without a corresponding + `bold') that manifests itself on certain terminals. */ + +- lendiff = local_prompt ? strlen (local_prompt) : 0; ++ lendiff = local_prompt_len; + od = ofd - old; /* index of first difference in visible line */ + if (current_line == 0 && !_rl_horizontal_scroll_mode && + _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 && +- od >= lendiff && _rl_last_c_pos <= prompt_last_invisible) ++ od >= lendiff && _rl_last_c_pos < PROMPT_ENDING_INDEX) + { + #if defined (__MSDOS__) + putc ('\r', rl_outstream); + #else + tputs (_rl_term_cr, 1, _rl_output_character_function); + #endif ++ if (modmark) ++ _rl_output_some_chars ("*", 1); + _rl_output_some_chars (local_prompt, lendiff); + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { + /* We take wrap_offset into account here so we can pass correct + information to _rl_move_cursor_relative. */ +- _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff) - wrap_offset; ++ _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff, 1) - wrap_offset + modmark; + cpos_adjusted = 1; + } + else +- _rl_last_c_pos = lendiff; ++ _rl_last_c_pos = lendiff + modmark; + } + ++ o_cpos = _rl_last_c_pos; ++ ++ /* When this function returns, _rl_last_c_pos is correct, and an absolute ++ cursor postion in multibyte mode, but a buffer index when not in a ++ multibyte locale. */ + _rl_move_cursor_relative (od, old); ++#if 1 ++#if defined (HANDLE_MULTIBYTE) ++ /* We need to indicate that the cursor position is correct in the presence of ++ invisible characters in the prompt string. Let's see if setting this when ++ we make sure we're at the end of the drawn prompt string works. */ ++ if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && ++ (_rl_last_c_pos > 0 || o_cpos > 0) && ++ _rl_last_c_pos == prompt_physical_chars) ++ cpos_adjusted = 1; ++#endif ++#endif + + /* if (len (new) > len (old)) + lendiff == difference in buffer +@@ -1438,7 +1565,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + When not using multibyte characters, these are equal */ + lendiff = (nls - nfd) - (ols - ofd); + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +- col_lendiff = _rl_col_width (new, nfd - new, nls - new) - _rl_col_width (old, ofd - old, ols - old); ++ col_lendiff = _rl_col_width (new, nfd - new, nls - new, 1) - _rl_col_width (old, ofd - old, ols - old, 1); + else + col_lendiff = lendiff; + +@@ -1463,7 +1590,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + /* Insert (diff (len (old), len (new)) ch. */ + temp = ne - nfd; + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +- col_temp = _rl_col_width (new, nfd - new, ne - new); ++ col_temp = _rl_col_width (new, nfd - new, ne - new, 1); + else + col_temp = temp; + +@@ -1471,22 +1598,60 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + { + /* Non-zero if we're increasing the number of lines. */ + int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin; ++ /* If col_lendiff is > 0, implying that the new string takes up more ++ screen real estate than the old, but lendiff is < 0, meaning that it ++ takes fewer bytes, we need to just output the characters starting ++ from the first difference. These will overwrite what is on the ++ display, so there's no reason to do a smart update. This can really ++ only happen in a multibyte environment. */ ++ if (lendiff < 0) ++ { ++ _rl_output_some_chars (nfd, temp); ++ _rl_last_c_pos += _rl_col_width (nfd, 0, temp, 1); ++ /* If nfd begins before any invisible characters in the prompt, ++ adjust _rl_last_c_pos to account for wrap_offset and set ++ cpos_adjusted to let the caller know. */ ++ if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ++ { ++ _rl_last_c_pos -= wrap_offset; ++ cpos_adjusted = 1; ++ } ++ return; ++ } + /* Sometimes it is cheaper to print the characters rather than + use the terminal's capabilities. If we're growing the number + of lines, make sure we actually cause the new line to wrap + around on auto-wrapping terminals. */ +- if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl)) ++ else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl)) + { + /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and + _rl_horizontal_scroll_mode == 1, inserting the characters with + _rl_term_IC or _rl_term_ic will screw up the screen because of the + invisible characters. We need to just draw them. */ +- if (*ols && (!_rl_horizontal_scroll_mode || _rl_last_c_pos > 0 || +- lendiff <= prompt_visible_length || !current_invis_chars)) ++ /* The same thing happens if we're trying to draw before the last ++ invisible character in the prompt string or we're increasing the ++ number of invisible characters in the line and we're not drawing ++ the entire prompt string. */ ++ if (*ols && ((_rl_horizontal_scroll_mode && ++ _rl_last_c_pos == 0 && ++ lendiff > prompt_visible_length && ++ current_invis_chars > 0) == 0) && ++ (((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && ++ current_line == 0 && wrap_offset && ++ ((nfd - new) <= prompt_last_invisible) && ++ (col_lendiff < prompt_visible_length)) == 0) && ++ (visible_wrap_offset >= current_invis_chars)) + { + insert_some_chars (nfd, lendiff, col_lendiff); + _rl_last_c_pos += col_lendiff; + } ++#if 0 /* XXX - for now */ ++ else if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && _rl_last_c_pos == 0 && wrap_offset && (nfd-new) <= prompt_last_invisible && col_lendiff < prompt_visible_length && visible_wrap_offset >= current_invis_chars) ++ { ++ _rl_output_some_chars (nfd, lendiff); ++ _rl_last_c_pos += col_lendiff; ++ } ++#endif + else if ((MB_CUR_MAX == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0) + { + /* At the end of a line the characters do not have to +@@ -1498,11 +1663,16 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + } + else + { +- /* We have horizontal scrolling and we are not inserting at +- the end. We have invisible characters in this line. This +- is a dumb update. */ + _rl_output_some_chars (nfd, temp); + _rl_last_c_pos += col_temp; ++ /* If nfd begins before the last invisible character in the ++ prompt, adjust _rl_last_c_pos to account for wrap_offset ++ and set cpos_adjusted to let the caller know. */ ++ if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ++ { ++ _rl_last_c_pos -= wrap_offset; ++ cpos_adjusted = 1; ++ } + return; + } + /* Copy (new) chars to screen from first diff to last match. */ +@@ -1510,15 +1680,23 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + if ((temp - lendiff) > 0) + { + _rl_output_some_chars (nfd + lendiff, temp - lendiff); +-#if 1 + /* XXX -- this bears closer inspection. Fixes a redisplay bug + reported against bash-3.0-alpha by Andreas Schwab involving + multibyte characters and prompt strings with invisible + characters, but was previously disabled. */ +- _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff); +-#else +- _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff); +-#endif ++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ++ twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff, 1); ++ else ++ twidth = temp - lendiff; ++ _rl_last_c_pos += twidth; ++ /* If nfd begins before the last invisible character in the ++ prompt, adjust _rl_last_c_pos to account for wrap_offset ++ and set cpos_adjusted to let the caller know. */ ++ if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ++ { ++ _rl_last_c_pos -= wrap_offset; ++ cpos_adjusted = 1; ++ } + } + } + else +@@ -1530,6 +1708,14 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + char in the current line (which implies we just output some invisible + characters) we need to adjust _rl_last_c_pos, since it represents + a physical character position. */ ++ if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && ++ current_line == prompt_last_screen_line && wrap_offset && ++ wrap_offset != prompt_invis_chars_first_line && ++ ((nfd-new) < (prompt_last_invisible-(current_line*_rl_screenwidth)))) ++ { ++ _rl_last_c_pos -= wrap_offset - prompt_invis_chars_first_line; ++ cpos_adjusted = 1; ++ } + } + } + else /* Delete characters from line. */ +@@ -1551,8 +1737,22 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + temp = nls - nfd; + if (temp > 0) + { ++ /* If nfd begins at the prompt, or before the invisible ++ characters in the prompt, we need to adjust _rl_last_c_pos ++ in a multibyte locale to account for the wrap offset and ++ set cpos_adjusted accordingly. */ + _rl_output_some_chars (nfd, temp); +- _rl_last_c_pos += _rl_col_width (nfd, 0, temp);; ++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ++ { ++ _rl_last_c_pos += _rl_col_width (nfd, 0, temp, 1); ++ if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ++ { ++ _rl_last_c_pos -= wrap_offset; ++ cpos_adjusted = 1; ++ } ++ } ++ else ++ _rl_last_c_pos += temp; + } + } + /* Otherwise, print over the existing material. */ +@@ -1560,16 +1760,37 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) + { + if (temp > 0) + { ++ /* If nfd begins at the prompt, or before the invisible ++ characters in the prompt, we need to adjust _rl_last_c_pos ++ in a multibyte locale to account for the wrap offset and ++ set cpos_adjusted accordingly. */ + _rl_output_some_chars (nfd, temp); + _rl_last_c_pos += col_temp; /* XXX */ ++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ++ { ++ if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ++ { ++ _rl_last_c_pos -= wrap_offset; ++ cpos_adjusted = 1; ++ } ++ } + } + lendiff = (oe - old) - (ne - new); + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +- col_lendiff = _rl_col_width (old, 0, oe - old) - _rl_col_width (new, 0, ne - new); ++ col_lendiff = _rl_col_width (old, 0, oe - old, 1) - _rl_col_width (new, 0, ne - new, 1); + else + col_lendiff = lendiff; + ++#if 0 + if (col_lendiff) ++#else ++ /* If we've already printed over the entire width of the screen, ++ including the old material, then col_lendiff doesn't matter and ++ space_to_eol will insert too many spaces. XXX - maybe we should ++ adjust col_lendiff based on the difference between _rl_last_c_pos ++ and _rl_screenwidth */ ++ if (col_lendiff && ((MB_CUR_MAX == 1 || rl_byte_oriented) || (_rl_last_c_pos < _rl_screenwidth))) ++#endif + { + if (_rl_term_autowrap && current_line < inv_botlin) + space_to_eol (col_lendiff); +@@ -1623,7 +1844,7 @@ rl_on_new_line_with_prompt () + + l = strlen (prompt_last_line); + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +- _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l); /* XXX */ ++ _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l, 1); /* XXX */ + else + _rl_last_c_pos = l; + +@@ -1658,10 +1879,11 @@ rl_on_new_line_with_prompt () + int + rl_forced_update_display () + { ++ register char *temp; ++ + if (visible_line) + { +- register char *temp = visible_line; +- ++ temp = visible_line; + while (*temp) + *temp++ = '\0'; + } +@@ -1684,9 +1906,14 @@ _rl_move_cursor_relative (new, data) + register int i; + int woff; /* number of invisible chars on current line */ + int cpos, dpos; /* current and desired cursor positions */ ++ int adjust; + +- woff = W_OFFSET (_rl_last_v_pos, wrap_offset); ++ woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset); + cpos = _rl_last_c_pos; ++ ++ if (cpos == 0 && cpos == new) ++ return; ++ + #if defined (HANDLE_MULTIBYTE) + /* If we have multibyte characters, NEW is indexed by the buffer point in + a multibyte string, but _rl_last_c_pos is the display position. In +@@ -1695,9 +1922,42 @@ _rl_move_cursor_relative (new, data) + as long as we are past them and they are counted by _rl_col_width. */ + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { +- dpos = _rl_col_width (data, 0, new); +- if (dpos > woff) +- dpos -= woff; ++ adjust = 1; ++ /* Try to short-circuit common cases and eliminate a bunch of multibyte ++ character function calls. */ ++ /* 1. prompt string */ ++ if (new == local_prompt_len && memcmp (data, local_prompt, new) == 0) ++ { ++ dpos = prompt_physical_chars; ++ cpos_adjusted = 1; ++ adjust = 0; ++ } ++ /* 2. prompt_string + line contents */ ++ else if (new > local_prompt_len && local_prompt && memcmp (data, local_prompt, local_prompt_len) == 0) ++ { ++ dpos = prompt_physical_chars + _rl_col_width (data, local_prompt_len, new, 1); ++ cpos_adjusted = 1; ++ adjust = 0; ++ } ++ else ++ dpos = _rl_col_width (data, 0, new, 1); ++ ++ /* Use NEW when comparing against the last invisible character in the ++ prompt string, since they're both buffer indices and DPOS is a ++ desired display position. */ ++ if (adjust && ((new > prompt_last_invisible) || /* XXX - don't use woff here */ ++ (prompt_physical_chars >= _rl_screenwidth && ++ _rl_last_v_pos == prompt_last_screen_line && ++ wrap_offset >= woff && dpos >= woff && ++ new > (prompt_last_invisible-(_rl_screenwidth*_rl_last_v_pos)-wrap_offset)))) ++ /* XXX last comparison might need to be >= */ ++ { ++ dpos -= woff; ++ /* Since this will be assigned to _rl_last_c_pos at the end (more ++ precisely, _rl_last_c_pos == dpos when this function returns), ++ let the caller know. */ ++ cpos_adjusted = 1; ++ } + } + else + #endif +@@ -1716,7 +1976,7 @@ _rl_move_cursor_relative (new, data) + else + #endif + i = _rl_last_c_pos - woff; +- if (new == 0 || CR_FASTER (new, _rl_last_c_pos) || ++ if (dpos == 0 || CR_FASTER (dpos, _rl_last_c_pos) || + (_rl_term_autowrap && i == _rl_screenwidth)) + { + #if defined (__MSDOS__) +@@ -1738,19 +1998,27 @@ _rl_move_cursor_relative (new, data) + sequence telling the terminal to move forward one character. + That kind of control is for people who don't know what the + data is underneath the cursor. */ +-#if defined (HACK_TERMCAP_MOTION) +- if (_rl_term_forward_char) +- { +- for (i = cpos; i < dpos; i++) +- tputs (_rl_term_forward_char, 1, _rl_output_character_function); +- } +- else +-#endif /* HACK_TERMCAP_MOTION */ ++ ++ /* However, we need a handle on where the current display position is ++ in the buffer for the immediately preceding comment to be true. ++ In multibyte locales, we don't currently have that info available. ++ Without it, we don't know where the data we have to display begins ++ in the buffer and we have to go back to the beginning of the screen ++ line. In this case, we can use the terminal sequence to move forward ++ if it's available. */ + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { +- tputs (_rl_term_cr, 1, _rl_output_character_function); +- for (i = 0; i < new; i++) +- putc (data[i], rl_outstream); ++ if (_rl_term_forward_char) ++ { ++ for (i = cpos; i < dpos; i++) ++ tputs (_rl_term_forward_char, 1, _rl_output_character_function); ++ } ++ else ++ { ++ tputs (_rl_term_cr, 1, _rl_output_character_function); ++ for (i = 0; i < new; i++) ++ putc (data[i], rl_outstream); ++ } + } + else + for (i = cpos; i < new; i++) +@@ -1908,6 +2176,7 @@ rl_message (va_alist) + &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; +@@ -1931,6 +2200,7 @@ rl_message (format, arg1, arg2) + &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; +@@ -1967,12 +2237,14 @@ rl_save_prompt () + saved_local_prompt = local_prompt; + saved_local_prefix = local_prompt_prefix; + saved_prefix_length = prompt_prefix_length; ++ saved_local_length = local_prompt_len; + saved_last_invisible = prompt_last_invisible; + saved_visible_length = prompt_visible_length; + saved_invis_chars_first_line = prompt_invis_chars_first_line; + saved_physical_chars = prompt_physical_chars; + + local_prompt = local_prompt_prefix = (char *)0; ++ local_prompt_len = 0; + prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0; + prompt_invis_chars_first_line = prompt_physical_chars = 0; + } +@@ -1985,6 +2257,7 @@ rl_restore_prompt () + + local_prompt = saved_local_prompt; + local_prompt_prefix = saved_local_prefix; ++ local_prompt_len = saved_local_length; + prompt_prefix_length = saved_prefix_length; + prompt_last_invisible = saved_last_invisible; + prompt_visible_length = saved_visible_length; +@@ -1993,6 +2266,7 @@ rl_restore_prompt () + + /* can test saved_local_prompt to see if prompt info has been saved. */ + saved_local_prompt = saved_local_prefix = (char *)0; ++ saved_local_length = 0; + saved_last_invisible = saved_visible_length = saved_prefix_length = 0; + saved_invis_chars_first_line = saved_physical_chars = 0; + } +@@ -2106,7 +2380,7 @@ insert_some_chars (string, count, col) + /* DEBUGGING */ + if (MB_CUR_MAX == 1 || rl_byte_oriented) + if (count != col) +- fprintf(stderr, "readline: debug: insert_some_chars: count (%d) != col (%d)\n", count, col); ++ _rl_ttymsg ("debug: insert_some_chars: count (%d) != col (%d)", count, col); + + /* If IC is defined, then we do not have to "enter" insert mode. */ + if (_rl_term_IC) +@@ -2189,7 +2463,8 @@ _rl_update_final () + char *last_line; + + last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]]; +- _rl_move_cursor_relative (_rl_screenwidth - 1, last_line); ++ cpos_buffer_position = -1; /* don't know where we are in buffer */ ++ _rl_move_cursor_relative (_rl_screenwidth - 1, last_line); /* XXX */ + _rl_clear_to_eol (0); + putc (last_line[_rl_screenwidth - 1], rl_outstream); + } +@@ -2232,6 +2507,7 @@ redraw_prompt (t) + &prompt_invis_chars_first_line, + &prompt_physical_chars); + local_prompt_prefix = (char *)NULL; ++ local_prompt_len = local_prompt ? strlen (local_prompt) : 0; + + rl_forced_update_display (); + +@@ -2245,10 +2521,14 @@ _rl_redisplay_after_sigwinch () + { + char *t; + +- /* Clear the current line and put the cursor at column 0. Make sure +- the right thing happens if we have wrapped to a new screen line. */ ++ /* Clear the last line (assuming that the screen size change will result in ++ either more or fewer characters on that line only) and put the cursor at ++ column 0. Make sure the right thing happens if we have wrapped to a new ++ screen line. */ + if (_rl_term_cr) + { ++ _rl_move_vert (_rl_vis_botlin); ++ + #if defined (__MSDOS__) + putc ('\r', rl_outstream); + #else +@@ -2284,7 +2564,7 @@ _rl_redisplay_after_sigwinch () + void + _rl_clean_up_for_exit () + { +- if (readline_echoing_p) ++ if (_rl_echoing_p) + { + _rl_move_vert (_rl_vis_botlin); + _rl_vis_botlin = 0; +@@ -2329,20 +2609,41 @@ _rl_current_display_line () + In the case of multibyte characters with stateful encoding, we have to + scan from the beginning of the string to take the state into account. */ + static int +-_rl_col_width (str, start, end) ++_rl_col_width (str, start, end, flags) + const char *str; +- int start, end; ++ int start, end, flags; + { + wchar_t wc; +- mbstate_t ps = {0}; ++ mbstate_t ps; + int tmp, point, width, max; + + if (end <= start) + return 0; ++ if (MB_CUR_MAX == 1 || rl_byte_oriented) ++{ ++_rl_ttymsg ("_rl_col_width: called with MB_CUR_MAX == 1"); ++ return (end - start); ++} ++ ++ memset (&ps, 0, sizeof (mbstate_t)); + + point = 0; + max = end; + ++ /* Try to short-circuit common cases. The adjustment to remove wrap_offset ++ is done by the caller. */ ++ /* 1. prompt string */ ++ if (flags && start == 0 && end == local_prompt_len && memcmp (str, local_prompt, local_prompt_len) == 0) ++ return (prompt_physical_chars + wrap_offset); ++ /* 2. prompt string + line contents */ ++ else if (flags && start == 0 && local_prompt_len > 0 && end > local_prompt_len && local_prompt && memcmp (str, local_prompt, local_prompt_len) == 0) ++ { ++ tmp = prompt_physical_chars + wrap_offset; ++ /* XXX - try to call ourselves recursively with non-prompt portion */ ++ tmp += _rl_col_width (str, local_prompt_len, end, flags); ++ return (tmp); ++ } ++ + while (point < start) + { + tmp = mbrlen (str + point, max, &ps); +--- a/readline/doc/ChangeLog.gdb ++++ b/readline/doc/ChangeLog.gdb +@@ -1,3 +1,7 @@ ++2011-04-25 Jan Kratochvil ++ ++ Imported readline 6.2, and upstream patch 001. ++ + 2006-04-24 Daniel Jacobowitz + + Imported readline 5.1, and upstream patches 001-004. +--- a/readline/doc/Makefile.in ++++ b/readline/doc/Makefile.in +@@ -1,25 +1,24 @@ + # This makefile for Readline library documentation is in -*- text -*- mode. + # Emacs likes it that way. + +-# Copyright (C) 1996-2004 Free Software Foundation, Inc. ++# Copyright (C) 1996-2009 Free Software Foundation, Inc. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# 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. ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . + + topdir = @top_srcdir@ + srcdir = @srcdir@ +-VPATH = .:@srcdir@ ++VPATH = @srcdir@ + + prefix = @prefix@ + +@@ -64,9 +63,9 @@ PSPDF = gs -sPAPERSIZE=${PAPERSIZE} -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -s + + RLSRC = $(srcdir)/rlman.texi $(srcdir)/rluser.texi \ + $(srcdir)/rltech.texi $(srcdir)/version.texi \ +- $(srcdir)/rluserman.texi ++ $(srcdir)/rluserman.texi $(srcdir)/fdl.texi + HISTSRC = $(srcdir)/history.texi $(srcdir)/hsuser.texi \ +- $(srcdir)/hstech.texi $(srcdir)/version.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 +@@ -83,7 +82,7 @@ PDFOBJ = readline.pdf history.pdf rluserman.pdf + + INTERMEDIATE_OBJ = rlman.dvi + +-DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) ++DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) $(PDFOBJ) + + .SUFFIXES: .0 .3 .ps .txt .dvi .html .pdf + +@@ -99,9 +98,11 @@ DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ) + $(RM) $@ + -${DVIPDF} $< + +-all: info dvi html ps text ++all: info dvi html ps text pdf + nodvi: info html text + ++xdist: $(DIST_DOCS) ++ + info: $(INFOOBJ) + dvi: $(DVIOBJ) + ps: $(PSOBJ) +@@ -156,13 +157,13 @@ history.html: ${HISTSRC} + + readline.0: readline.3 + +-readline_3.ps: readline.3 ++readline_3.ps: $(srcdir)/readline.3 + ${RM} $@ + ${GROFF} -man < $(srcdir)/readline.3 > $@ + + history.0: history.3 + +-history_3.ps: history.3 ++history_3.ps: $(srcdir)/history.3 + ${RM} $@ + ${GROFF} -man < $(srcdir)/history.3 > $@ + +@@ -182,7 +183,7 @@ distclean: clean maybe-clean + $(RM) Makefile + + maybe-clean: +- -if test "X$(topdir)" != "X$(BUILD_DIR)"; then \ ++ -if test "X$(topdir)" != "X.." && test "X$(topdir)" != "X$(BUILD_DIR)"; then \ + $(RM) $(DIST_DOCS); \ + fi + +--- a/readline/doc/fdl.texi ++++ b/readline/doc/fdl.texi +@@ -1,13 +1,12 @@ ++@c The GNU Free Documentation License. ++@center Version 1.3, 3 November 2008 + +-@node GNU Free Documentation License +-@appendixsec GNU Free Documentation License +- +-@cindex FDL, GNU Free Documentation License +-@center Version 1.2, November 2002 ++@c This file is intended to be included within another document, ++@c hence no sectioning command or @node. + + @display +-Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. +-59 Temple Place, Suite 330, Boston, MA 02111-1307, USA ++Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. ++@uref{http://fsf.org/} + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. +@@ -112,6 +111,9 @@ formats which do not have any title page as such, ``Title Page'' means + the text near the most prominent appearance of the work's title, + preceding the beginning of the body of the text. + ++The ``publisher'' means any person or entity that distributes copies ++of the Document to the public. ++ + A section ``Entitled XYZ'' means a named subunit of the Document whose + title either is precisely XYZ or contains XYZ in parentheses following + text that translates XYZ in another language. (Here XYZ stands for a +@@ -344,7 +346,7 @@ and independent documents or works, in or on a volume of a storage or + distribution medium, is called an ``aggregate'' if the copyright + resulting from the compilation is not used to limit the legal rights + of the compilation's users beyond what the individual works permit. +-When the Document is included an aggregate, this License does not ++When the Document is included in an aggregate, this License does not + apply to the other works in the aggregate which are not themselves + derivative works of the Document. + +@@ -380,13 +382,30 @@ title. + @item + TERMINATION + +-You may not copy, modify, sublicense, or distribute the Document except +-as expressly provided for under this License. Any other attempt to +-copy, modify, sublicense or distribute the Document is void, and will +-automatically terminate your rights under this License. However, +-parties who have received copies, or rights, from you under this +-License will not have their licenses terminated so long as such +-parties remain in full compliance. ++You may not copy, modify, sublicense, or distribute the Document ++except as expressly provided under this License. Any attempt ++otherwise to copy, modify, sublicense, or distribute it is void, and ++will automatically terminate your rights under this License. ++ ++However, if you cease all violation of this License, then your license ++from a particular copyright holder is reinstated (a) provisionally, ++unless and until the copyright holder explicitly and finally ++terminates your license, and (b) permanently, if the copyright holder ++fails to notify you of the violation by some reasonable means prior to ++60 days after the cessation. ++ ++Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, receipt of a copy of some or all of the same material does ++not give you any rights to use it. + + @item + FUTURE REVISIONS OF THIS LICENSE +@@ -404,11 +423,46 @@ following the terms and conditions either of that specified version or + of any later version that has been published (not as a draft) by the + Free Software Foundation. If the Document does not specify a version + number of this License, you may choose any version ever published (not +-as a draft) by the Free Software Foundation. ++as a draft) by the Free Software Foundation. If the Document ++specifies that a proxy can decide which future versions of this ++License can be used, that proxy's public statement of acceptance of a ++version permanently authorizes you to choose that version for the ++Document. ++ ++@item ++RELICENSING ++ ++``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any ++World Wide Web server that publishes copyrightable works and also ++provides prominent facilities for anybody to edit those works. A ++public wiki that anybody can edit is an example of such a server. A ++``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the ++site means any set of copyrightable works thus published on the MMC ++site. ++ ++``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 ++license published by Creative Commons Corporation, a not-for-profit ++corporation with a principal place of business in San Francisco, ++California, as well as future copyleft versions of that license ++published by that same organization. ++ ++``Incorporate'' means to publish or republish a Document, in whole or ++in part, as part of another Document. ++ ++An MMC is ``eligible for relicensing'' if it is licensed under this ++License, and if all works that were first published under this License ++somewhere other than this MMC, and subsequently incorporated in whole ++or in part into the MMC, (1) had no cover texts or invariant sections, ++and (2) were thus incorporated prior to November 1, 2008. ++ ++The operator of an MMC Site may republish an MMC contained in the site ++under CC-BY-SA on the same site at any time before August 1, 2009, ++provided the MMC is eligible for relicensing. ++ + @end enumerate + + @page +-@appendixsubsec ADDENDUM: How to use this License for your documents ++@heading ADDENDUM: How to use this License for your documents + + To use this License in a document you have written, include a copy of + the License in the document and put the following copyright and +@@ -418,16 +472,16 @@ license notices just after the title page: + @group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document +- under the terms of the GNU Free Documentation License, Version 1.2 ++ 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 ++ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover ++ Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + @end group + @end smallexample + + If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +-replace the ``with...Texts.'' line with this: ++replace the ``with@dots{}Texts.'' line with this: + + @smallexample + @group +--- a/readline/doc/history.3 ++++ b/readline/doc/history.3 +@@ -6,9 +6,9 @@ + .\" Case Western Reserve University + .\" chet@ins.CWRU.Edu + .\" +-.\" Last Change: Thu Jul 31 08:46:08 EDT 2003 ++.\" Last Change: Thu Aug 12 22:24:41 EDT 2010 + .\" +-.TH HISTORY 3 "2003 July 31" "GNU History 5.0" ++.TH HISTORY 3 "2010 August 12" "GNU History 6.2" + .\" + .\" File Name macro. This used to be `.PN', for Path Name, + .\" but Sun doesn't seem to like that very much. +@@ -40,8 +40,8 @@ + .SH NAME + history \- GNU History Library + .SH COPYRIGHT +-.if t The GNU History Library is Copyright \(co 1989-2002 by the Free Software Foundation, Inc. +-.if n The GNU History Library is Copyright (C) 1989-2002 by the Free Software Foundation, Inc. ++.if t The GNU History Library is Copyright \(co 1989-2011 by the Free Software Foundation, Inc. ++.if n The GNU History Library is Copyright (C) 1989-2011 by the Free Software Foundation, Inc. + .SH DESCRIPTION + Many programs read input from the user a line at a time. The GNU + History library is able to keep track of those lines, associate arbitrary +@@ -83,6 +83,8 @@ the history expansion character. + .PP + An event designator is a reference to a command line entry in the + history list. ++Unless the reference is absolute, events are relative to the current ++position in the history list. + .PP + .PD 0 + .TP +@@ -96,18 +98,22 @@ Refer to command line + .IR n . + .TP + .B !\-\fIn\fR +-Refer to the current command line minus ++Refer to the current command minus + .IR n . + .TP + .B !! + Refer to the previous command. This is a synonym for `!\-1'. + .TP + .B !\fIstring\fR +-Refer to the most recent command starting with ++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 containing ++Refer to the most recent command ++preceding the current postition in the history list ++containing + .IR string . + The trailing \fB?\fP may be omitted if + .I string +@@ -569,10 +575,13 @@ The number of entries currently stored in the history list. + The maximum number of history entries. This must be changed using + \fBstifle_history()\fP. + +-.Vb int history_write_timestamps ++.Vb int history_wite_timestamps + If non-zero, timestamps are written to the history file, so they can be + preserved between sessions. The default value is 0, meaning that + timestamps are not saved. ++The current timestamp format uses the value of \fIhistory_comment_char\fP ++to delimit timestamp entries in the history file. If that variable does ++not have a value (the default), timestamps will not be written. + + .Vb char history_expansion_char + The character that introduces a history event. The default is \fB!\fP. +--- a/readline/doc/history.texi ++++ b/readline/doc/history.texi +@@ -4,8 +4,6 @@ + @settitle GNU History Library + @c %**end of header (This is for running Texinfo on a region.) + +-@setchapternewpage odd +- + @include version.texi + + @copying +@@ -14,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-2004 Free Software Foundation, Inc. ++Copyright @copyright{} 1988--2011 Free Software Foundation, Inc. + + Permission is granted to make and distribute verbatim copies of + this manual provided the copyright notice and this permission notice +@@ -22,15 +20,16 @@ are preserved on all copies. + + @quotation + Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or ++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, with the Front-Cover texts being ``A GNU Manual,'' ++Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', + and with the Back-Cover Texts as in (a) below. A copy of the license is +-included in the section entitled ``GNU Free Documentation License.'' ++included in the section entitled ``GNU Free Documentation License''. ++ ++(a) The FSF's Back-Cover Text is: You are free to copy and modify ++this GNU manual. Buying copies from GNU Press supports the FSF in ++developing GNU and promoting software freedom.'' + +-(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify +-this GNU Manual, like GNU software. Copies published by the Free +-Software Foundation raise funds for GNU development.'' + @end quotation + @end copying + +@@ -72,7 +71,7 @@ typed input. + @menu + * Using History Interactively:: GNU History User's Manual. + * Programming with GNU History:: GNU History Programmer's Manual. +-* Copying This Manual:: Copying This Manual. ++* GNU Free Documentation License:: License for copying this manual. + * Concept Index:: Index of concepts described in this manual. + * Function and Variable Index:: Index of externally visible functions + and variables. +@@ -84,12 +83,8 @@ typed input. + @include hsuser.texi + @include hstech.texi + +-@node Copying This Manual +-@appendix Copying This Manual +- +-@menu +-* GNU Free Documentation License:: License for copying this manual. +-@end menu ++@node GNU Free Documentation License ++@appendix GNU Free Documentation License + + @include fdl.texi + +--- a/readline/doc/hstech.texi ++++ b/readline/doc/hstech.texi +@@ -1,7 +1,7 @@ + @ignore + This file documents the user interface to the GNU History library. + +-Copyright (C) 1988-2002 Free Software Foundation, Inc. ++Copyright (C) 1988-2011 Free Software Foundation, Inc. + Authored by Brian Fox and Chet Ramey. + + Permission is granted to make and distribute verbatim copies of this manual +@@ -426,6 +426,10 @@ The maximum number of history entries. This must be changed using + If non-zero, timestamps are written to the history file, so they can be + preserved between sessions. The default value is 0, meaning that + timestamps are not saved. ++ ++The current timestamp format uses the value of @var{history_comment_char} ++to delimit timestamp entries in the history file. If that variable does ++not have a value (the default), timestamps will not be written. + @end deftypevar + + @deftypevar char history_expansion_char +--- a/readline/doc/hsuser.texi ++++ b/readline/doc/hsuser.texi +@@ -1,7 +1,7 @@ + @ignore + This file documents the user interface to the GNU History library. + +-Copyright (C) 1988-2002 Free Software Foundation, Inc. ++Copyright (C) 1988--2011 Free Software Foundation, Inc. + Authored by Brian Fox and Chet Ramey. + + Permission is granted to make and distribute verbatim copies of this manual +@@ -97,7 +97,11 @@ to contain no more than @env{$HISTFILESIZE} + lines. If @env{HISTFILESIZE} is not set, no truncation is performed. + + If the @env{HISTTIMEFORMAT} is set, the time stamp information +-associated with each history entry is written to the history file. ++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 previous history line. + + The builtin command @code{fc} may be used to list or edit and re-execute + a portion of the history list. +@@ -133,7 +137,7 @@ history list and history file. + @item fc + @btindex fc + @example +-@code{fc [-e @var{ename}] [-nlr] [@var{first}] [@var{last}]} ++@code{fc [-e @var{ename}] [-lnr] [@var{first}] [@var{last}]} + @code{fc -s [@var{pat}=@var{rep}] [@var{command}]} + @end example + +@@ -277,7 +281,10 @@ them, so that they are available for subsequent recall. + This is most useful in conjunction with Readline. + + The shell allows control of the various characters used by the +-history expansion mechanism with the @code{histchars} variable. ++history expansion mechanism with the @code{histchars} variable, ++as explained above (@pxref{Bash Variables}). The shell uses ++the history comment character to mark history timestamps when ++writing the history file. + @end ifset + + @menu +@@ -292,6 +299,8 @@ history expansion mechanism with the @code{histchars} variable. + + An event designator is a reference to a command line entry in the + history list. ++Unless the reference is absolute, events are relative to the current ++position in the history list. + @cindex history events + + @table @asis +@@ -317,10 +326,15 @@ Refer to the command @var{n} lines back. + Refer to the previous command. This is a synonym for @samp{!-1}. + + @item @code{!@var{string}} +-Refer to the most recent command starting with @var{string}. ++Refer to the most recent command ++preceding the current position in the history list ++starting with @var{string}. + + @item @code{!?@var{string}[?]} +-Refer to the most recent command containing @var{string}. The trailing ++Refer to the most recent command ++preceding the current position in the history list ++containing @var{string}. ++The trailing + @samp{?} may be omitted if the @var{string} is followed immediately by + a newline. + +@@ -412,7 +426,7 @@ of the following modifiers, each preceded by a @samp{:}. + Remove a trailing pathname component, leaving only the head. + + @item t +-Remove all leading pathname components, leaving the tail. ++Remove all leading pathname components, leaving the tail. + + @item r + Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving +--- a/readline/doc/inc-hist.texinfo ++++ /dev/null +@@ -1,457 +0,0 @@ +-@ignore +-This file documents the user interface to the GNU History library. +- +-Copyright (C) 1988-2002 Free Software Foundation, Inc. +-Authored by Brian Fox and Chet Ramey. +- +-Permission is granted to make and distribute verbatim copies of this manual +-provided the copyright notice and this permission notice are preserved on +-all copies. +- +-Permission is granted to process this file through Tex and print the +-results, provided the printed document carries copying permission notice +-identical to this one except for the removal of this paragraph (this +-paragraph not being relevant to the printed manual). +- +-Permission is granted to copy and distribute modified versions of this +-manual under the conditions for verbatim copying, provided also that the +-GNU Copyright statement is available to the distributee, and provided that +-the entire resulting derived work is distributed under the terms of a +-permission notice identical to this one. +- +-Permission is granted to copy and distribute translations of this manual +-into another language, under the above conditions for modified versions. +-@end ignore +- +-@node Using History Interactively +-@chapter Using History Interactively +- +-@c @ifclear BashFeatures +-@c @defcodeindex bt +-@c @end ifclear +- +-@ifset BashFeatures +-This chapter describes how to use the @sc{gnu} History Library +-interactively, from a user's standpoint. +-It should be considered a user's guide. +-For information on using the @sc{gnu} History Library in other programs, +-see the @sc{gnu} Readline Library Manual. +-@end ifset +-@ifclear BashFeatures +-This chapter describes how to use the @sc{gnu} History Library interactively, +-from a user's standpoint. It should be considered a user's guide. +-For information on using the @sc{gnu} History Library in other programs, +-see the @sc{gnu} Readline Library Manual. +-@end ifclear +- +-@ifset BashFeatures +-@menu +-* Bash History Facilities:: How Bash lets you manipulate your command +- history. +-* Bash History Builtins:: The Bash builtin commands that manipulate +- the command history. +-* History Interaction:: What it feels like using History as a user. +-@end menu +-@end ifset +-@ifclear BashFeatures +-@menu +-* History Interaction:: What it feels like using History as a user. +-@end menu +-@end ifclear +- +-@ifset BashFeatures +-@node Bash History Facilities +-@section Bash History Facilities +-@cindex command history +-@cindex history list +- +-When the @option{-o history} option to the @code{set} builtin +-is enabled (@pxref{The Set Builtin}), +-the shell provides access to the @dfn{command history}, +-the list of commands previously typed. +-The value of the @env{HISTSIZE} shell variable is used as the +-number of commands to save in a history list. +-The text of the last @env{$HISTSIZE} +-commands (default 500) is saved. +-The shell stores each command in the history list prior to +-parameter and variable expansion +-but after history expansion is performed, subject to the +-values of the shell variables +-@env{HISTIGNORE} and @env{HISTCONTROL}. +- +-When the shell starts up, the history is initialized from the +-file named by the @env{HISTFILE} variable (default @file{~/.bash_history}). +-The file named by the value of @env{HISTFILE} is truncated, if +-necessary, to contain no more than the number of lines specified by +-the value of the @env{HISTFILESIZE} variable. +-When an interactive shell exits, the last +-@env{$HISTSIZE} lines are copied from the history list to the file +-named by @env{$HISTFILE}. +-If the @code{histappend} shell option is set (@pxref{Bash Builtins}), +-the lines are appended to the history file, +-otherwise the history file is overwritten. +-If @env{HISTFILE} +-is unset, or if the history file is unwritable, the history is +-not saved. After saving the history, the history file is truncated +-to contain no more than @env{$HISTFILESIZE} +-lines. If @env{HISTFILESIZE} is not set, no truncation is performed. +- +-If the @env{HISTTIMEFORMAT} is set, the time stamp information +-associated with each history entry is written to the history file. +- +-The builtin command @code{fc} may be used to list or edit and re-execute +-a portion of the history list. +-The @code{history} builtin may be used to display or modify the history +-list and manipulate the history file. +-When using command-line editing, search commands +-are available in each editing mode that provide access to the +-history list (@pxref{Commands For History}). +- +-The shell allows control over which commands are saved on the history +-list. The @env{HISTCONTROL} and @env{HISTIGNORE} +-variables may be set to cause the shell to save only a subset of the +-commands entered. +-The @code{cmdhist} +-shell option, if enabled, causes the shell to attempt to save each +-line of a multi-line command in the same history entry, adding +-semicolons where necessary to preserve syntactic correctness. +-The @code{lithist} +-shell option causes the shell to save the command with embedded newlines +-instead of semicolons. +-The @code{shopt} builtin is used to set these options. +-@xref{Bash Builtins}, for a description of @code{shopt}. +- +-@node Bash History Builtins +-@section Bash History Builtins +-@cindex history builtins +- +-Bash provides two builtin commands which manipulate the +-history list and history file. +- +-@table @code +- +-@item fc +-@btindex fc +-@example +-@code{fc [-e @var{ename}] [-nlr] [@var{first}] [@var{last}]} +-@code{fc -s [@var{pat}=@var{rep}] [@var{command}]} +-@end example +- +-Fix Command. In the first form, a range of commands from @var{first} to +-@var{last} is selected from the history list. Both @var{first} and +-@var{last} may be specified as a string (to locate the most recent +-command beginning with that string) or as a number (an index into the +-history list, where a negative number is used as an offset from the +-current command number). If @var{last} is not specified it is set to +-@var{first}. If @var{first} is not specified it is set to the previous +-command for editing and @minus{}16 for listing. If the @option{-l} flag is +-given, the commands are listed on standard output. The @option{-n} flag +-suppresses the command numbers when listing. The @option{-r} flag +-reverses the order of the listing. Otherwise, the editor given by +-@var{ename} is invoked on a file containing those commands. If +-@var{ename} is not given, the value of the following variable expansion +-is used: @code{$@{FCEDIT:-$@{EDITOR:-vi@}@}}. This says to use the +-value of the @env{FCEDIT} variable if set, or the value of the +-@env{EDITOR} variable if that is set, or @code{vi} if neither is set. +-When editing is complete, the edited commands are echoed and executed. +- +-In the second form, @var{command} is re-executed after each instance +-of @var{pat} in the selected command is replaced by @var{rep}. +- +-A useful alias to use with the @code{fc} command is @code{r='fc -s'}, so +-that typing @samp{r cc} runs the last command beginning with @code{cc} +-and typing @samp{r} re-executes the last command (@pxref{Aliases}). +- +-@item history +-@btindex history +-@example +-history [@var{n}] +-history -c +-history -d @var{offset} +-history [-anrw] [@var{filename}] +-history -ps @var{arg} +-@end example +- +-With no options, display the history list with line numbers. +-Lines prefixed with a @samp{*} have been modified. +-An argument of @var{n} lists only the last @var{n} lines. +-If the shell variable @env{HISTTIMEFORMAT} is set and not null, +-it is used as a format string for @var{strftime} to display +-the time stamp associated with each displayed history entry. +-No intervening blank is printed between the formatted time stamp +-and the history line. +- +-Options, if supplied, have the following meanings: +- +-@table @code +-@item -c +-Clear the history list. This may be combined +-with the other options to replace the history list completely. +- +-@item -d @var{offset} +-Delete the history entry at position @var{offset}. +-@var{offset} should be specified as it appears when the history is +-displayed. +- +-@item -a +-Append the new +-history lines (history lines entered since the beginning of the +-current Bash session) to the history file. +- +-@item -n +-Append the history lines not already read from the history file +-to the current history list. These are lines appended to the history +-file since the beginning of the current Bash session. +- +-@item -r +-Read the current history file and append its contents to +-the history list. +- +-@item -w +-Write out the current history to the history file. +- +-@item -p +-Perform history substitution on the @var{arg}s and display the result +-on the standard output, without storing the results in the history list. +- +-@item -s +-The @var{arg}s are added to the end of +-the history list as a single entry. +- +-@end table +- +-When any of the @option{-w}, @option{-r}, @option{-a}, or @option{-n} options is +-used, if @var{filename} +-is given, then it is used as the history file. If not, then +-the value of the @env{HISTFILE} variable is used. +- +-@end table +-@end ifset +- +-@node History Interaction +-@section History Expansion +-@cindex history expansion +- +-The History library provides a history expansion feature that is similar +-to the history expansion provided by @code{csh}. This section +-describes the syntax used to manipulate the history information. +- +-History expansions introduce words from the history list into +-the input stream, making it easy to repeat commands, insert the +-arguments to a previous command into the current input line, or +-fix errors in previous commands quickly. +- +-History expansion takes place in two parts. The first is to determine +-which line from the history list should be used during substitution. +-The second is to select portions of that line for inclusion into the +-current one. The line selected from the history is called the +-@dfn{event}, and the portions of that line that are acted upon are +-called @dfn{words}. Various @dfn{modifiers} are available to manipulate +-the selected words. The line is broken into words in the same fashion +-that Bash does, so that several words +-surrounded by quotes are considered one word. +-History expansions are introduced by the appearance of the +-history expansion character, which is @samp{!} by default. +-@ifset BashFeatures +-Only @samp{\} and @samp{'} may be used to escape the history expansion +-character. +-@end ifset +- +-@ifset BashFeatures +-Several shell options settable with the @code{shopt} +-builtin (@pxref{Bash Builtins}) may be used to tailor +-the behavior of history expansion. If the +-@code{histverify} shell option is enabled, and Readline +-is being used, history substitutions are not immediately passed to +-the shell parser. +-Instead, the expanded line is reloaded into the Readline +-editing buffer for further modification. +-If Readline is being used, and the @code{histreedit} +-shell option is enabled, a failed history expansion will be +-reloaded into the Readline editing buffer for correction. +-The @option{-p} option to the @code{history} builtin command +-may be used to see what a history expansion will do before using it. +-The @option{-s} option to the @code{history} builtin may be used to +-add commands to the end of the history list without actually executing +-them, so that they are available for subsequent recall. +-This is most useful in conjunction with Readline. +- +-The shell allows control of the various characters used by the +-history expansion mechanism with the @code{histchars} variable. +-@end ifset +- +-@menu +-* Event Designators:: How to specify which history line to use. +-* Word Designators:: Specifying which words are of interest. +-* Modifiers:: Modifying the results of substitution. +-@end menu +- +-@node Event Designators +-@subsection Event Designators +-@cindex event designators +- +-An event designator is a reference to a command line entry in the +-history list. +-@cindex history events +- +-@table @asis +- +-@item @code{!} +-@ifset BashFeatures +-Start a history substitution, except when followed by a space, tab, +-the end of the line, @samp{=} or @samp{(} (when the +-@code{extglob} shell option is enabled using the @code{shopt} builtin). +-@end ifset +-@ifclear BashFeatures +-Start a history substitution, except when followed by a space, tab, +-the end of the line, or @samp{=}. +-@end ifclear +- +-@item @code{!@var{n}} +-Refer to command line @var{n}. +- +-@item @code{!-@var{n}} +-Refer to the command @var{n} lines back. +- +-@item @code{!!} +-Refer to the previous command. This is a synonym for @samp{!-1}. +- +-@item @code{!@var{string}} +-Refer to the most recent command starting with @var{string}. +- +-@item @code{!?@var{string}[?]} +-Refer to the most recent command containing @var{string}. The trailing +-@samp{?} may be omitted if the @var{string} is followed immediately by +-a newline. +- +-@item @code{^@var{string1}^@var{string2}^} +-Quick Substitution. Repeat the last command, replacing @var{string1} +-with @var{string2}. Equivalent to +-@code{!!:s/@var{string1}/@var{string2}/}. +- +-@item @code{!#} +-The entire command line typed so far. +- +-@end table +- +-@node Word Designators +-@subsection Word Designators +- +-Word designators are used to select desired words from the event. +-A @samp{:} separates the event specification from the word designator. It +-may be omitted if the word designator begins with a @samp{^}, @samp{$}, +-@samp{*}, @samp{-}, or @samp{%}. Words are numbered from the beginning +-of the line, with the first word being denoted by 0 (zero). Words are +-inserted into the current line separated by single spaces. +- +-@need 0.75 +-For example, +- +-@table @code +-@item !! +-designates the preceding command. When you type this, the preceding +-command is repeated in toto. +- +-@item !!:$ +-designates the last argument of the preceding command. This may be +-shortened to @code{!$}. +- +-@item !fi:2 +-designates the second argument of the most recent command starting with +-the letters @code{fi}. +-@end table +- +-@need 0.75 +-Here are the word designators: +- +-@table @code +- +-@item 0 (zero) +-The @code{0}th word. For many applications, this is the command word. +- +-@item @var{n} +-The @var{n}th word. +- +-@item ^ +-The first argument; that is, word 1. +- +-@item $ +-The last argument. +- +-@item % +-The word matched by the most recent @samp{?@var{string}?} search. +- +-@item @var{x}-@var{y} +-A range of words; @samp{-@var{y}} abbreviates @samp{0-@var{y}}. +- +-@item * +-All of the words, except the @code{0}th. This is a synonym for @samp{1-$}. +-It is not an error to use @samp{*} if there is just one word in the event; +-the empty string is returned in that case. +- +-@item @var{x}* +-Abbreviates @samp{@var{x}-$} +- +-@item @var{x}- +-Abbreviates @samp{@var{x}-$} like @samp{@var{x}*}, but omits the last word. +- +-@end table +- +-If a word designator is supplied without an event specification, the +-previous command is used as the event. +- +-@node Modifiers +-@subsection Modifiers +- +-After the optional word designator, you can add a sequence of one or more +-of the following modifiers, each preceded by a @samp{:}. +- +-@table @code +- +-@item h +-Remove a trailing pathname component, leaving only the head. +- +-@item t +-Remove all leading pathname components, leaving the tail. +- +-@item r +-Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving +-the basename. +- +-@item e +-Remove all but the trailing suffix. +- +-@item p +-Print the new command but do not execute it. +- +-@ifset BashFeatures +-@item q +-Quote the substituted words, escaping further substitutions. +- +-@item x +-Quote the substituted words as with @samp{q}, +-but break into words at spaces, tabs, and newlines. +-@end ifset +- +-@item s/@var{old}/@var{new}/ +-Substitute @var{new} for the first occurrence of @var{old} in the +-event line. Any delimiter may be used in place of @samp{/}. +-The delimiter may be quoted in @var{old} and @var{new} +-with a single backslash. If @samp{&} appears in @var{new}, +-it is replaced by @var{old}. A single backslash will quote +-the @samp{&}. The final delimiter is optional if it is the last +-character on the input line. +- +-@item & +-Repeat the previous substitution. +- +-@item g +-@itemx a +-Cause changes to be applied over the entire event line. Used in +-conjunction with @samp{s}, as in @code{gs/@var{old}/@var{new}/}, +-or with @samp{&}. +- +-@item G +-Apply the following @samp{s} modifier once to each word in the event. +- +-@end table +--- a/readline/doc/readline.3 ++++ b/readline/doc/readline.3 +@@ -6,9 +6,9 @@ + .\" Case Western Reserve University + .\" chet@ins.CWRU.Edu + .\" +-.\" Last Change: Tue Sep 13 12:07:26 EDT 2005 ++.\" Last Change: Sat Aug 28 18:56:32 EDT 2010 + .\" +-.TH READLINE 3 "2005 Sep 13" "GNU Readline 5.1-beta1" ++.TH READLINE 3 "2010 August 28" "GNU Readline 6.2" + .\" + .\" File Name macro. This used to be `.PN', for Path Name, + .\" but Sun doesn't seem to like that very much. +@@ -34,8 +34,8 @@ 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\-2004 by the Free Software Foundation, Inc. +-.if t Readline is Copyright \(co 1989\-2004 by the Free Software Foundation, Inc. ++.if n Readline is Copyright (C) 1989\-2011 Free Software Foundation, Inc. ++.if t Readline is Copyright \(co 1989\-2011 Free Software Foundation, Inc. + .SH DESCRIPTION + .LP + .B readline +@@ -76,7 +76,7 @@ is read with a non\-empty line, it is + treated as a newline. + .SH NOTATION + .LP +-An emacs-style notation is used to denote ++An Emacs-style notation is used to denote + keystrokes. Control keys are denoted by C\-\fIkey\fR, e.g., C\-n + means Control\-N. Similarly, + .I meta +@@ -116,6 +116,8 @@ The name of this file is taken from the value of the + .B INPUTRC + environment variable. If that variable is unset, the default is + .IR ~/.inputrc . ++If that file does not exist or cannot be read, the ultimate default is ++.IR /etc/inputrc . + When a program which uses the readline library starts up, the + init file is read, and the key bindings and variables are set. + There are only a few basic constructs allowed in the +@@ -168,6 +170,8 @@ command or the text of a macro and a key sequence to which + it should be bound. The name may be specified in one of two ways: + as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP + prefixes, or as a key sequence. ++The name and key sequence are separated by a colon. There can be no ++whitespace between the name and the colon. + .PP + When using the form \fBkeyname\fP:\^\fIfunction-name\fP or \fImacro\fP, + .I keyname +@@ -356,11 +360,30 @@ This command is bound to + in emacs mode and to + .B # + in vi command mode. ++.TP ++.B completion\-display\-width (-1) ++The number of screen columns used to display possible matches ++when performing completion. ++The value is ignored if it is less than 0 or greater than the terminal ++screen width. ++A value of 0 will cause matches to be displayed one per line. ++The default value is -1. + .TP + .B completion\-ignore\-case (Off) + If set to \fBOn\fP, readline performs filename matching and completion + in a case\-insensitive fashion. + .TP ++.B completion\-map\-case (Off) ++If set to \fBOn\fP, and \fBcompletion\-ignore\-case\fP is enabled, readline ++treats hyphens (\fI\-\fP) and underscores (\fI_\fP) as equivalent when ++performing case\-insensitive filename matching and completion. ++.TP ++.B completion\-prefix\-display\-length (0) ++The length in characters of the common prefix of a list of possible ++completions that is displayed without modification. When set to a ++value greater than zero, common prefixes longer than this value are ++replaced with an ellipsis when displaying possible completions. ++.TP + .B completion\-query\-items (100) + This determines when the user is queried about viewing + the number of possible completions +@@ -384,27 +407,41 @@ mapped to \fBself-insert\fP. + .TP + .B editing\-mode (emacs) + Controls whether readline begins with a set of key bindings similar +-to emacs or vi. ++to \fIEmacs\fP or \fIvi\fP. + .B editing\-mode + can be set to either + .B emacs + or + .BR vi . + .TP ++.B echo\-control\-characters (On) ++When set to \fBOn\fP, on operating systems that indicate they support it, ++readline echoes a character corresponding to a signal generated from the ++keyboard. ++.TP + .B enable\-keypad (Off) + When set to \fBOn\fP, readline will try to enable the application + keypad when it is called. Some systems need this to enable the + arrow keys. + .TP ++.B enable\-meta\-key (On) ++When set to \fBOn\fP, readline will try to enable any meta modifier ++key the terminal claims to support when it is called. On many terminals, ++the meta key is used to send eight-bit characters. ++.TP + .B expand\-tilde (Off) +-If set to \fBon\fP, tilde expansion is performed when readline ++If set to \fBOn\fP, tilde expansion is performed when readline + attempts word completion. + .TP + .B history\-preserve\-point (Off) +-If set to \fBon\fP, the history code attempts to place point at the ++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 (0) ++Set the maximum number of history entries saved in the history list. If ++set to zero, the number of entries in the history list is not limited. ++.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 +@@ -451,9 +488,15 @@ have a slash appended (subject to the value of + .B match\-hidden\-files (On) + This variable, when set to \fBOn\fP, causes readline to match files whose + names begin with a `.' (hidden files) when performing filename +-completion, unless the leading `.' is ++completion. ++If set to \fBOff\fP, the leading `.' must be + supplied by the user in the filename to be completed. + .TP ++.B menu\-complete\-display\-prefix (Off) ++If set to \fBOn\fP, menu completion displays the common prefix of the ++list of possible completions (which may be empty) before cycling through ++the list. ++.TP + .B output\-meta (Off) + If set to \fBOn\fP, readline will display characters with the + eighth bit set directly rather than as a meta-prefixed escape +@@ -467,10 +510,16 @@ to display a screenful of possible completions at a time. + If set to \fBOn\fP, readline will display completions with matches + sorted horizontally in alphabetical order, rather than down the screen. + .TP ++.B revert\-all\-at\-newline (Off) ++If set to \fBOn\fP, readline will undo all changes to history lines ++before returning when \fBaccept\-line\fP is executed. By default, ++history lines may be modified and retain individual undo lists across ++calls to \fBreadline\fP. ++.TP + .B show\-all\-if\-ambiguous (Off) + This alters the default behavior of the completion functions. If + set to +-.BR on , ++.BR On , + words which have more than one possible completion cause the + matches to be listed immediately instead of ringing the bell. + .TP +@@ -478,12 +527,20 @@ 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 + a common prefix) cause the matches to be listed immediately instead + of ringing the bell. + .TP ++.B skip\-completed\-text (Off) ++If set to \fBOn\fP, this alters the default completion behavior when ++inserting a single match into the line. It's only active when ++performing completion in the middle of a word. If enabled, readline ++does not insert characters from the completion that match characters ++after point in the word being completed, so portions of the word ++following the cursor are not duplicated. ++.TP + .B visible\-stats (Off) + If set to \fBOn\fP, a character denoting a file's type as reported + by \fIstat\fP(2) is appended to the filename when listing possible +@@ -530,7 +587,7 @@ library sets the \fIapplication name\fP, and an initialization + file can test for a particular value. + This could be used to bind key sequences to functions useful for + a specific program. For instance, the following command adds a +-key sequence that quotes the current or previous word in Bash: ++key sequence that quotes the current or previous word in \fBbash\fP: + .sp 1 + .RS + .nf +@@ -706,10 +763,14 @@ as if the "!\fIn\fP" history expansion had been specified. + .B + yank\-last\-arg (M\-.\^, M\-_\^) + Insert the last argument to the previous command (the last word of +-the previous history entry). With an argument, +-behave exactly like \fByank\-nth\-arg\fP. ++the previous history entry). ++With a numeric argument, behave exactly like \fByank\-nth\-arg\fP. + Successive calls to \fByank\-last\-arg\fP move back through the history +-list, inserting the last argument of each line in turn. ++list, inserting the last word (or the word specified by the argument to ++the first call) of each line in turn. ++Any numeric argument supplied to these successive calls determines ++the direction to move through the history. A negative argument switches ++the direction through the history (back or forward). + The history expansion facilities are used to extract the last argument, + as if the "!$" history expansion had been specified. + .PD +@@ -884,6 +945,12 @@ only attempts filename completion under certain circumstances. + .TP + .B possible\-completions (M\-?) + List the possible completions of the text before point. ++When displaying completions, readline sets the number of columns used ++for display to the value of \fBcompletion-display-width\fP, the value of ++the environment variable ++.SM ++.BR COLUMNS , ++or the screen width, in that order. + .TP + .B insert\-completions (M\-*) + Insert all completions of the text before point +@@ -904,6 +971,11 @@ through the list. + This command is intended to be bound to \fBTAB\fP, but is unbound + by default. + .TP ++.B menu\-complete\-backward ++Identical to \fBmenu\-complete\fP, but moves backward through the list ++of possible completions, as if \fBmenu\-complete\fP had been given a ++negative argument. This command is unbound by default. ++.TP + .B delete\-char\-or\-list + Deletes the character under the cursor if not at the beginning or + end of the line (like \fBdelete-char\fP). +@@ -977,6 +1049,15 @@ character. A negative count searches for previous occurrences. + A character is read and point is moved to the previous occurrence of that + character. A negative count searches for subsequent occurrences. + .TP ++.B skip\-csi\-sequence ++Read enough characters to consume a multi-key sequence such as those ++defined for keys like Home and End. Such sequences begin with a ++Control Sequence Indicator (CSI), usually ESC\-[. If this sequence is ++bound to "\e[", keys producing such sequences will have no effect ++unless explicitly bound to a readline command, instead of inserting ++stray characters into the editing buffer. This is unbound by default, ++but usually bound to ESC\-[. ++.TP + .B insert\-comment (M\-#) + Without a numeric argument, the value of the readline + .B comment\-begin +--- a/readline/doc/rlman.texi ++++ b/readline/doc/rlman.texi +@@ -4,7 +4,6 @@ + @settitle GNU Readline Library + @comment %**end of header (This is for running Texinfo on a region.) + @synindex vr fn +-@setchapternewpage odd + + @include version.texi + +@@ -14,7 +13,7 @@ This manual describes the GNU Readline Library + consistency of user interface across discrete programs which provide + a command line interface. + +-Copyright @copyright{} 1988-2004 Free Software Foundation, Inc. ++Copyright @copyright{} 1988--2011 Free Software Foundation, Inc. + + Permission is granted to make and distribute verbatim copies of + this manual provided the copyright notice and this permission notice +@@ -22,15 +21,16 @@ are preserved on all copies. + + @quotation + Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or ++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, with the Front-Cover texts being ``A GNU Manual,'' ++Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', + and with the Back-Cover Texts as in (a) below. A copy of the license is +-included in the section entitled ``GNU Free Documentation License.'' ++included in the section entitled ``GNU Free Documentation License''. ++ ++(a) The FSF's Back-Cover Text is: You are free to copy and modify ++this GNU manual. Buying copies from GNU Press supports the FSF in ++developing GNU and promoting software freedom.'' + +-(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify +-this GNU Manual, like GNU software. Copies published by the Free +-Software Foundation raise funds for GNU development.'' + @end quotation + @end copying + +@@ -71,7 +71,7 @@ provide a command line interface. + @menu + * Command Line Editing:: GNU Readline User's Manual. + * Programming with GNU Readline:: GNU Readline Programmer's Manual. +-* Copying This Manual:: Copying this manual. ++* GNU Free Documentation License:: License for copying this manual. + * Concept Index:: Index of concepts described in this manual. + * Function and Variable Index:: Index of externally visible functions + and variables. +@@ -81,12 +81,8 @@ provide a command line interface. + @include rluser.texi + @include rltech.texi + +-@node Copying This Manual +-@appendix Copying This Manual +- +-@menu +-* GNU Free Documentation License:: License for copying this manual. +-@end menu ++@node GNU Free Documentation License ++@appendix GNU Free Documentation License + + @include fdl.texi + +--- a/readline/doc/rltech.texi ++++ b/readline/doc/rltech.texi +@@ -1,14 +1,13 @@ + @comment %**start of header (This is for running Texinfo on a region.) + @setfilename rltech.info + @comment %**end of header (This is for running Texinfo on a region.) +-@setchapternewpage odd + + @ifinfo + This document describes the GNU Readline Library, a utility for aiding + in the consistency of user interface across discrete programs that need + to provide a command line interface. + +-Copyright (C) 1988-2005 Free Software Foundation, Inc. ++Copyright (C) 1988--2011 Free Software Foundation, Inc. + + Permission is granted to make and distribute verbatim copies of + this manual provided the copyright notice and this permission notice +@@ -351,6 +350,12 @@ The @code{rl_set_prompt()} function (@pxref{Redisplay}) may + be used to modify the prompt string after calling @code{readline()}. + @end deftypevar + ++@deftypevar {char *} rl_display_prompt ++The string displayed as the prompt. This is usually identical to ++@var{rl_prompt}, but may be changed temporarily by functions that ++use the prompt string as a message area, such as incremental search. ++@end deftypevar ++ + @deftypevar int rl_already_prompted + If an application wishes to display the prompt itself, rather than have + Readline do it the first time @code{readline()} is called, it should set +@@ -518,6 +523,20 @@ Readline is performing word completion. + Readline is currently executing the readline signal handler. + @item RL_STATE_UNDOING + Readline is performing an undo. ++@item RL_STATE_INPUTPENDING ++Readline has input pending due to a call to @code{rl_execute_next()}. ++@item RL_STATE_TTYCSAVED ++Readline has saved the values of the terminal's special characters. ++@item RL_STATE_CALLBACK ++Readline is currently using the alternate (callback) interface ++(@pxref{Alternate Interface}). ++@item RL_STATE_VIMOTION ++Readline is reading the argument to a vi-mode "motion" command. ++@item RL_STATE_MULTIKEY ++Readline is reading a multiple-keystroke command. ++@item RL_STATE_VICMDONCE ++Readline has entered vi command (movement) mode at least one time during ++the current call to @code{readline()}. + @item RL_STATE_DONE + Readline has read a key sequence bound to @code{accept-line} + and is about to return the line to the caller. +@@ -603,7 +622,7 @@ Readline which keymap to use. + @deftypefun Keymap rl_make_bare_keymap (void) + Returns a new, empty keymap. The space for the keymap is allocated with + @code{malloc()}; the caller should free it by calling +-@code{rl_discard_keymap()} when done. ++@code{rl_free_keymap()} when done. + @end deftypefun + + @deftypefun Keymap rl_copy_keymap (Keymap map) +@@ -617,7 +636,13 @@ the Meta digits bound to produce numeric arguments. + @end deftypefun + + @deftypefun void rl_discard_keymap (Keymap keymap) +-Free the storage associated with @var{keymap}. ++Free the storage associated with the data in @var{keymap}. ++The caller should free @var{keymap}. ++@end deftypefun ++ ++@deftypefun void rl_free_keymap (Keymap keymap) ++Free all storage associated with @var{keymap}. This calls ++@code{rl_discard_keymap} to free subordindate keymaps and macros. + @end deftypefun + + Readline has several internal keymaps. These functions allow you to +@@ -793,7 +818,8 @@ Print the names of all bindable Readline functions to @code{rl_outstream}. + @deftypefun {const char **} rl_funmap_names (void) + Return a NULL terminated array of known function names. The array is + sorted. The array itself is allocated, but not the strings inside. You +-should @code{free()} the array when you are done, but not the pointers. ++should free the array, but not the pointers, using @code{free} or ++@code{rl_free} when you are done. + @end deftypefun + + @deftypefun int rl_add_funmap_entry (const char *name, rl_command_func_t *function) +@@ -1033,8 +1059,10 @@ pending input has not already been read with @code{rl_read_key()}. + @deftypefun int rl_set_keyboard_input_timeout (int u) + While waiting for keyboard input in @code{rl_read_key()}, Readline will + wait for @var{u} microseconds for input before calling any function +-assigned to @code{rl_event_hook}. The default waiting period is +-one-tenth of a second. Returns the old timeout value. ++assigned to @code{rl_event_hook}. @var{u} must be greater than or equal ++to zero (a zero-length timeout is equivalent to a poll). ++The default waiting period is one-tenth of a second. ++Returns the old timeout value. + @end deftypefun + + @node Terminal Management +@@ -1075,6 +1103,26 @@ environment variable is used. + @node Utility Functions + @subsection Utility Functions + ++@deftypefun int rl_save_state (struct readline_state *sp) ++Save a snapshot of Readline's internal state to @var{sp}. ++The contents of the @var{readline_state} structure are documented ++in @file{readline.h}. ++The caller is responsible for allocating the structure. ++@end deftypefun ++ ++@deftypefun int rl_restore_state (struct readline_state *sp) ++Restore Readline's internal state to that stored in @var{sp}, which must ++have been saved by a call to @code{rl_save_state}. ++The contents of the @var{readline_state} structure are documented ++in @file{readline.h}. ++The caller is responsible for freeing the structure. ++@end deftypefun ++ ++@deftypefun void rl_free (void *mem) ++Deallocate the memory pointed to by @var{mem}. @var{mem} must have been ++allocated by @code{malloc}. ++@end deftypefun ++ + @deftypefun void rl_replace_line (const char *text, int clear_undo) + Replace the contents of @code{rl_line_buffer} with @var{text}. + The point and mark are preserved, if possible. +@@ -1082,7 +1130,7 @@ If @var{clear_undo} is non-zero, the undo list associated with the + current line is cleared. + @end deftypefun + +-@deftypefun int rl_extend_line_buffer (int len) ++@deftypefun void rl_extend_line_buffer (int len) + Ensure that @code{rl_line_buffer} has enough space to hold @var{len} + characters, possibly reallocating it if necessary. + @end deftypefun +@@ -1109,6 +1157,9 @@ of strings, in argv format, such as a list of completion matches. + is the length of the longest string in @code{matches}. This function uses + the setting of @code{print-completions-horizontally} to select how the + matches are displayed (@pxref{Readline Init File Syntax}). ++When displaying completions, this function sets the number of columns used ++for display to the value of @code{completion-display-width}, the value of ++the environment variable @env{COLUMNS}, or the screen width, in that order. + @end deftypefun + + The following are implemented as macros, defined in @code{chardefs.h}. +@@ -1392,6 +1443,13 @@ call @code{rl_resize_terminal()} or @code{rl_set_screen_size()} to force + Readline to update its idea of the terminal size when a @code{SIGWINCH} + is received. + ++@deftypefun void rl_echo_signal_char (int sig) ++If an application wishes to install its own signal handlers, but still ++have readline display characters that generate signals, calling this ++function with @var{sig} set to @code{SIGINT}, @code{SIGQUIT}, or ++@code{SIGTSTP} will display the character generating that signal. ++@end deftypefun ++ + @deftypefun void rl_resize_terminal (void) + Update Readline's internal screen size by reading values from the kernel. + @end deftypefun +@@ -1659,15 +1717,49 @@ from the array must be freed. + + @deftypevar {rl_icppfunc_t *} rl_directory_completion_hook + This function, if defined, is allowed to modify the directory portion +-of filenames Readline completes. It is called with the address of a +-string (the current directory name) as an argument, and may modify that string. ++of filenames Readline completes. ++It could be used to expand symbolic links or shell variables in pathnames. ++It is called with the address of a string (the current directory name) as an ++argument, and may modify that string. + If the string is replaced with a new string, the old value should be freed. + Any modified directory name should have a trailing slash. +-The modified value will be displayed as part of the completion, replacing ++The modified value will be used as part of the completion, replacing + the directory portion of the pathname the user typed. +-It returns an integer that should be non-zero if the function modifies +-its directory argument. +-It could be used to expand symbolic links or shell variables in pathnames. ++At the least, even if no other expansion is performed, this function should ++remove any quote characters from the directory name, because its result will ++be passed directly to @code{opendir()}. ++The directory completion hook returns an integer that should be non-zero if ++the function modifies its directory argument. ++The function should not modify the directory argument if it returns 0. ++@end deftypevar ++ ++@ignore ++@deftypevar extern rl_icppfunc_t *rl_directory_rewrite_hook; ++If non-zero, this is the address of a function to call when completing ++a directory name. This function takes the address of the directory name ++to be modified as an argument. Unlike @code{rl_directory_completion_hook}, ++it only modifies the directory name used in @code{opendir}, not what is ++displayed when the possible completions are printed or inserted. It is ++called before rl_directory_completion_hook. ++ ++I'm not happy with how this works yet, so it's undocumented. ++@end deftypevar ++@end ignore ++ ++@deftypevar {rl_dequote_func_t *} rl_filename_rewrite_hook ++If non-zero, this is the address of a function called when reading ++directory entries from the filesystem for completion and comparing ++them to the partial word to be completed. The function should ++perform any necesary application or system-specific conversion on ++the filename, such as converting between character sets or converting ++from a filesystem format to a character input format. ++The function takes two arguments: @var{fname}, the filename to be converted, ++and @var{fnlen}, its length in bytes. ++It must either return its first argument (if no conversion takes place) ++or the converted filename in newly-allocated memory. The converted ++form is used to compare against the word to be completed, and, if it ++matches, is added to the list of matches. Readline will free the ++allocated string. + @end deftypevar + + @deftypevar {rl_compdisp_func_t *} rl_completion_display_matches_hook +@@ -1822,6 +1914,15 @@ if the application's completion function returns no matches. + It should be set only by an application's completion function. + @end deftypevar + ++@deftypevar int rl_sort_completion_matches ++If an application sets this variable to 0, Readline will not sort the ++list of completions (which implies that it cannot remove any duplicate ++completions). The default value is 1, which means that Readline will ++sort the completions and, depending on the value of ++@code{rl_ignore_completion_duplicates}, will attempt to remove duplicate ++matches. ++@end deftypevar ++ + @deftypevar int rl_completion_type + Set to a character describing the type of completion Readline is currently + attempting; see the description of @code{rl_complete_internal()} +@@ -1831,6 +1932,13 @@ completion function is called, allowing such functions to present + the same interface as @code{rl_complete()}. + @end deftypevar + ++@deftypevar int rl_completion_invoking_key ++Set to the final character in the key sequence that invoked one of the ++completion functions that call @code{rl_complete_internal()}. This is ++set to the appropriate value before any application-specific completion ++function is called. ++@end deftypevar ++ + @deftypevar int rl_inhibit_completion + If this variable is non-zero, completion is inhibited. The completion + character will be inserted as any other bound to @code{self-insert}. +@@ -1851,27 +1959,51 @@ history list. + GNU Readline library. This application interactively allows users + to manipulate files and their modes. */ + +-#include ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ + #include +-#include ++#ifdef HAVE_SYS_FILE_H ++# include ++#endif + #include +-#include ++ ++#ifdef HAVE_UNISTD_H ++# include ++#endif ++ ++#include ++#include ++#include ++ ++#if defined (HAVE_STRING_H) ++# include ++#else /* !HAVE_STRING_H */ ++# include ++#endif /* !HAVE_STRING_H */ ++ ++#ifdef HAVE_STDLIB_H ++# include ++#endif ++ ++#include + + #include + #include + +-extern char *xmalloc (); ++extern char *xmalloc PARAMS((size_t)); + + /* The names of functions that actually do the manipulation. */ +-int com_list __P((char *)); +-int com_view __P((char *)); +-int com_rename __P((char *)); +-int com_stat __P((char *)); +-int com_pwd __P((char *)); +-int com_delete __P((char *)); +-int com_help __P((char *)); +-int com_cd __P((char *)); +-int com_quit __P((char *)); ++int com_list PARAMS((char *)); ++int com_view PARAMS((char *)); ++int com_rename PARAMS((char *)); ++int com_stat PARAMS((char *)); ++int com_pwd PARAMS((char *)); ++int com_delete PARAMS((char *)); ++int com_help PARAMS((char *)); ++int com_cd PARAMS((char *)); ++int com_quit PARAMS((char *)); + + /* A structure which contains information on the commands this program + can understand. */ +@@ -1904,12 +2036,12 @@ COMMAND *find_command (); + /* The name of this program, as taken from argv[0]. */ + char *progname; + +-/* When non-zero, this means the user is done using this program. */ ++/* When non-zero, this global means the user is done using this program. */ + int done; + + char * + dupstr (s) +- int s; ++ char *s; + @{ + char *r; + +@@ -2034,12 +2166,12 @@ stripwhite (string) + /* */ + /* **************************************************************** */ + +-char *command_generator __P((const char *, int)); +-char **fileman_completion __P((const char *, int, int)); ++char *command_generator PARAMS((const char *, int)); ++char **fileman_completion PARAMS((const char *, int, int)); + +-/* Tell the GNU Readline library how to complete. We want to try to +- complete on command names if this is the first word in the line, or +- on filenames if not. */ ++/* Tell the GNU Readline library how to complete. We want to try to complete ++ on command names if this is the first word in the line, or on filenames ++ if not. */ + initialize_readline () + @{ + /* Allow conditional parsing of the ~/.inputrc file. */ +@@ -2049,11 +2181,11 @@ initialize_readline () + rl_attempted_completion_function = fileman_completion; + @} + +-/* Attempt to complete on the contents of TEXT. START and END +- bound the region of rl_line_buffer that contains the word to +- complete. TEXT is the word to complete. We can use the entire +- contents of rl_line_buffer in case we want to do some simple +- parsing. Returnthe array of matches, or NULL if there aren't any. */ ++/* Attempt to complete on the contents of TEXT. START and END bound the ++ region of rl_line_buffer that contains the word to complete. TEXT is ++ the word to complete. We can use the entire contents of rl_line_buffer ++ in case we want to do some simple parsing. Return the array of matches, ++ or NULL if there aren't any. */ + char ** + fileman_completion (text, start, end) + const char *text; +@@ -2072,9 +2204,9 @@ fileman_completion (text, start, end) + return (matches); + @} + +-/* Generator function for command completion. STATE lets us +- know whether to start from scratch; without any state +- (i.e. STATE == 0), then we start at the top of the list. */ ++/* Generator function for command completion. STATE lets us know whether ++ to start from scratch; without any state (i.e. STATE == 0), then we ++ start at the top of the list. */ + char * + command_generator (text, state) + const char *text; +@@ -2083,17 +2215,16 @@ command_generator (text, state) + static int list_index, len; + char *name; + +- /* If this is a new word to complete, initialize now. This +- includes saving the length of TEXT for efficiency, and +- initializing the index variable to 0. */ ++ /* If this is a new word to complete, initialize now. This includes ++ saving the length of TEXT for efficiency, and initializing the index ++ variable to 0. */ + if (!state) + @{ + list_index = 0; + len = strlen (text); + @} + +- /* Return the next name which partially matches from the +- command list. */ ++ /* Return the next name which partially matches from the command list. */ + while (name = commands[list_index].name) + @{ + list_index++; +@@ -2133,7 +2264,12 @@ com_view (arg) + if (!valid_argument ("view", arg)) + return 1; + ++#if defined (__MSDOS__) ++ /* more.com doesn't grok slashes in pathnames */ ++ sprintf (syscom, "less %s", arg); ++#else + sprintf (syscom, "more %s", arg); ++#endif + return (system (syscom)); + @} + +@@ -2160,7 +2296,8 @@ com_stat (arg) + + printf ("Statistics for `%s':\n", arg); + +- printf ("%s has %d link%s, and is %d byte%s in length.\n", arg, ++ printf ("%s has %d link%s, and is %d byte%s in length.\n", ++ arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + finfo.st_size, +@@ -2249,8 +2386,7 @@ com_pwd (ignore) + return 0; + @} + +-/* The user wishes to quit using this program. Just set DONE +- non-zero. */ ++/* The user wishes to quit using this program. Just set DONE non-zero. */ + com_quit (arg) + char *arg; + @{ +@@ -2263,13 +2399,12 @@ too_dangerous (caller) + char *caller; + @{ + fprintf (stderr, +- "%s: Too dangerous for me to distribute.\n", ++ "%s: Too dangerous for me to distribute. Write it yourself.\n", + caller); +- fprintf (stderr, "Write it yourself.\n"); + @} + +-/* Return non-zero if ARG is a valid argument for CALLER, +- else print an error message and return zero. */ ++/* 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; +--- a/readline/doc/rluser.texi ++++ b/readline/doc/rluser.texi +@@ -1,7 +1,6 @@ + @comment %**start of header (This is for running Texinfo on a region.) + @setfilename rluser.info + @comment %**end of header (This is for running Texinfo on a region.) +-@setchapternewpage odd + + @ignore + This file documents the end user interface to the GNU command line +@@ -10,7 +9,7 @@ use these features. There is a document entitled "readline.texinfo" + which contains both end-user and programmer documentation for the + GNU Readline Library. + +-Copyright (C) 1988-2005 Free Software Foundation, Inc. ++Copyright (C) 1988--2011 Free Software Foundation, Inc. + + Authored by Brian Fox and Chet Ramey. + +@@ -48,6 +47,16 @@ command line editing interface. + @ifset BashFeatures + Command line editing is provided by the Readline library, which is + used by several different programs, including Bash. ++Command line editing is enabled by default when using an interactive shell, ++unless the @option{--noediting} option is supplied at shell invocation. ++Line editing is also used when using the @option{-e} option to the ++@code{read} builtin command (@pxref{Bash Builtins}). ++By default, the line editing commands are similar to those of Emacs. ++A vi-style line editing interface is also available. ++Line editing can be enabled at any time using the @option{-o emacs} or ++@option{-o vi} options to the @code{set} builtin command ++(@pxref{The Set Builtin}), or disabled using the @option{+o emacs} or ++@option{+o vi} options to @code{set}. + @end ifset + + @menu +@@ -336,7 +345,9 @@ file is taken from the value of the shell variable @env{INPUTRC}. If + @ifclear BashFeatures + file is taken from the value of the environment variable @env{INPUTRC}. If + @end ifclear +-that variable is unset, the default is @file{~/.inputrc}. ++that variable is unset, the default is @file{~/.inputrc}. If that ++file does not exist or cannot be read, the ultimate default is ++@file{/etc/inputrc}. + + When a program which uses the Readline library starts up, the + init file is read, and the key bindings are set. +@@ -420,11 +431,34 @@ The string to insert at the beginning of the line when the + @code{insert-comment} command is executed. The default value + is @code{"#"}. + ++@item completion-display-width ++@vindex completion-display-width ++The number of screen columns used to display possible matches ++when performing completion. ++The value is ignored if it is less than 0 or greater than the terminal ++screen width. ++A value of 0 will cause matches to be displayed one per line. ++The default value is -1. ++ + @item completion-ignore-case ++@vindex completion-ignore-case + If set to @samp{on}, Readline performs filename matching and completion + in a case-insensitive fashion. + The default value is @samp{off}. + ++@item completion-map-case ++@vindex completion-map-case ++If set to @samp{on}, and @var{completion-ignore-case} is enabled, Readline ++treats hyphens (@samp{-}) and underscores (@samp{_}) as equivalent when ++performing case-insensitive filename matching and completion. ++ ++@item completion-prefix-display-length ++@vindex completion-prefix-display-length ++The length in characters of the common prefix of a list of possible ++completions that is displayed without modification. When set to a ++value greater than zero, common prefixes longer than this value are ++replaced with an ellipsis when displaying possible completions. ++ + @item completion-query-items + @vindex completion-query-items + The number of possible completions that determines when the user is +@@ -456,12 +490,23 @@ key bindings is used. By default, Readline starts up in Emacs editing + mode, where the keystrokes are most similar to Emacs. This variable can be + set to either @samp{emacs} or @samp{vi}. + ++@item echo-control-characters ++When set to @samp{on}, on operating systems that indicate they support it, ++readline echoes a character corresponding to a signal generated from the ++keyboard. The default is @samp{on}. ++ + @item enable-keypad + @vindex enable-keypad + When set to @samp{on}, Readline will try to enable the application + keypad when it is called. Some systems need this to enable the + arrow keys. The default is @samp{off}. + ++@item enable-meta-key ++When set to @samp{on}, Readline will try to enable any meta modifier ++key the terminal claims to support when it is called. On many terminals, ++the meta key is used to send eight-bit characters. ++The default is @samp{on}. ++ + @item expand-tilde + @vindex expand-tilde + If set to @samp{on}, tilde expansion is performed when Readline +@@ -469,10 +514,16 @@ attempts word completion. The default is @samp{off}. + + @item history-preserve-point + @vindex history-preserve-point +-If set to @samp{on}, the history code attempts to place point at the ++If set to @samp{on}, the history code attempts to place the point (the ++current cursor position) at the + same location on each history line retrieved with @code{previous-history} + or @code{next-history}. The default is @samp{off}. + ++@item history-size ++@vindex history-size ++Set the maximum number of history entries saved in the history list. If ++set to zero, the number of entries in the history list is not limited. ++ + @item horizontal-scroll-mode + @vindex horizontal-scroll-mode + This variable can be set to either @samp{on} or @samp{off}. Setting it +@@ -535,10 +586,17 @@ The default is @samp{off}. + @vindex match-hidden-files + This variable, when set to @samp{on}, causes Readline to match files whose + names begin with a @samp{.} (hidden files) when performing filename +-completion, unless the leading @samp{.} is ++completion. ++If set to @samp{off}, the leading @samp{.} must be + supplied by the user in the filename to be completed. + This variable is @samp{on} by default. + ++@item menu-complete-display-prefix ++@vindex menu-complete-display-prefix ++If set to @samp{on}, menu completion displays the common prefix of the ++list of possible completions (which may be empty) before cycling through ++the list. The default is @samp{off}. ++ + @item output-meta + @vindex output-meta + If set to @samp{on}, Readline will display characters with the +@@ -556,6 +614,13 @@ If set to @samp{on}, Readline will display completions with matches + sorted horizontally in alphabetical order, rather than down the screen. + The default is @samp{off}. + ++@item revert-all-at-newline ++@vindex revert-all-at-newline ++If set to @samp{on}, Readline will undo all changes to history lines ++before returning when @code{accept-line} is executed. By default, ++history lines may be modified and retain individual undo lists across ++calls to @code{readline}. The default is @samp{off}. ++ + @item show-all-if-ambiguous + @vindex show-all-if-ambiguous + This alters the default behavior of the completion functions. If +@@ -575,6 +640,20 @@ a common prefix) cause the matches to be listed immediately instead + of ringing the bell. + The default value is @samp{off}. + ++@item skip-completed-text ++@vindex skip-completed-text ++If set to @samp{on}, this alters the default completion behavior when ++inserting a single match into the line. It's only active when ++performing completion in the middle of a word. If enabled, readline ++does not insert characters from the completion that match characters ++after point in the word being completed, so portions of the word ++following the cursor are not duplicated. ++For instance, if this is enabled, attempting completion when the cursor ++is after the @samp{e} in @samp{Makefile} will result in @samp{Makefile} ++rather than @samp{Makefilefile}, assuming there is a single possible ++completion. ++The default value is @samp{off}. ++ + @item visible-stats + @vindex visible-stats + If set to @samp{on}, a character denoting a file's type +@@ -593,9 +672,11 @@ the command does. + Once you know the name of the command, simply place on a line + in the init file the name of the key + you wish to bind the command to, a colon, and then the name of the +-command. The name of the key +-can be expressed in different ways, depending on what you find most +-comfortable. ++command. ++There can be no space between the key name and the colon -- that will be ++interpreted as part of the key name. ++The name of the key can be expressed in different ways, depending on ++what you find most comfortable. + + In addition to command names, readline allows keys to be bound + to a string that is inserted when the key is pressed (a @var{macro}). +@@ -937,12 +1018,22 @@ Move forward a character. + Move back a character. + + @item forward-word (M-f) +-Move forward to the end of the next word. Words are composed of +-letters and digits. ++Move forward to the end of the next word. ++Words are composed of letters and digits. + + @item backward-word (M-b) +-Move back to the start of the current or previous word. Words are +-composed of letters and digits. ++Move back to the start of the current or previous word. ++Words are composed of letters and digits. ++ ++@ifset BashFeatures ++@item shell-forward-word () ++Move forward to the end of the next word. ++Words are delimited by non-quoted shell metacharacters. ++ ++@item shell-backward-word () ++Move back to the start of the current or previous word. ++Words are delimited by non-quoted shell metacharacters. ++@end ifset + + @item clear-screen (C-l) + Clear the screen and redraw the current line, +@@ -1029,10 +1120,14 @@ as if the @samp{!@var{n}} history expansion had been specified. + + @item yank-last-arg (M-. or M-_) + Insert last argument to the previous command (the last word of the +-previous history entry). With an +-argument, behave exactly like @code{yank-nth-arg}. ++previous history entry). ++With a numeric argument, behave exactly like @code{yank-nth-arg}. + Successive calls to @code{yank-last-arg} move back through the history +-list, inserting the last argument of each line in turn. ++list, inserting the last word (or the word specified by the argument to ++the first call) of each line in turn. ++Any numeric argument supplied to these successive calls determines ++the direction to move through the history. A negative argument switches ++the direction through the history (back or forward). + The history expansion facilities are used to extract the last argument, + as if the @samp{!$} history expansion had been specified. + +@@ -1138,6 +1233,17 @@ Word boundaries are the same as @code{forward-word}. + Kill the word behind point. + Word boundaries are the same as @code{backward-word}. + ++@ifset BashFeatures ++@item shell-kill-word () ++Kill from point to the end of the current word, or if between ++words, to the end of the next word. ++Word boundaries are the same as @code{shell-forward-word}. ++ ++@item shell-backward-kill-word () ++Kill the word behind point. ++Word boundaries are the same as @code{shell-backward-word}. ++@end ifset ++ + @item 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. +@@ -1219,6 +1325,9 @@ The default is filename completion. + + @item possible-completions (M-?) + List the possible completions of the text before point. ++When displaying completions, Readline sets the number of columns used ++for display to the value of @code{completion-display-width}, the value of ++the environment variable @env{COLUMNS}, or the screen width, in that order. + + @item insert-completions (M-*) + Insert all completions of the text before point that would have +@@ -1238,6 +1347,11 @@ through the list. + This command is intended to be bound to @key{TAB}, but is unbound + by default. + ++@item menu-complete-backward () ++Identical to @code{menu-complete}, but moves backward through the list ++of possible completions, as if @code{menu-complete} had been given a ++negative argument. ++ + @item delete-char-or-list () + Deletes the character under the cursor if not at the beginning or + end of the line (like @code{delete-char}). +@@ -1293,6 +1407,11 @@ Attempt completion on the text before point, comparing + the text against lines from the history list for possible + completion matches. + ++@item dabbrev-expand () ++Attempt menu completion on the text before point, comparing ++the text against lines from the history list for possible ++completion matches. ++ + @item complete-into-braces (M-@{) + Perform filename completion and insert the list of possible completions + enclosed within braces so the list is available to the shell +@@ -1372,6 +1491,15 @@ A character is read and point is moved to the previous occurrence + of that character. A negative count searches for subsequent + occurrences. + ++@item skip-csi-sequence () ++Read enough characters to consume a multi-key sequence such as those ++defined for keys like Home and End. Such sequences begin with a ++Control Sequence Indicator (CSI), usually ESC-[. If this sequence is ++bound to "\e[", keys producing such sequences will have no effect ++unless explicitly bound to a readline command, instead of inserting ++stray characters into the editing buffer. This is unbound by default, ++but usually bound to ESC-[. ++ + @item insert-comment (M-#) + Without a numeric argument, the value of the @code{comment-begin} + variable is inserted at the beginning of the current line. +@@ -1481,7 +1609,7 @@ editing mode. + While the Readline library does not have a full set of @code{vi} + editing functions, it does contain enough to allow simple editing + of the line. The Readline @code{vi} mode behaves as specified in +-the @sc{posix} 1003.2 standard. ++the @sc{posix} standard. + + @ifset BashFeatures + In order to switch interactively between @code{emacs} and @code{vi} +@@ -1515,10 +1643,15 @@ the programmable completion facilities are invoked. + First, the command name is identified. + If a compspec has been defined for that command, the + compspec is used to generate the list of possible completions for the word. ++If the command word is the empty string (completion attempted at the ++beginning of an empty line), any compspec defined with ++the @option{-E} option to @code{complete} is used. + If the command word is a full pathname, a compspec for the full + pathname is searched for first. + If no compspec is found for the full pathname, an attempt is made to + find a compspec for the portion following the final slash. ++If those searches do not result in a compspec, any compspec defined with ++the @option{-D} option to @code{complete} is used as the default. + + Once a compspec has been found, it is used to generate the list of + matching words. +@@ -1555,9 +1688,9 @@ completed, and the matching words become the possible completions. + + After these matches have been generated, any shell function or command + specified with the @option{-F} and @option{-C} options is invoked. +-When the command or function is invoked, the @env{COMP_LINE} and +-@env{COMP_POINT} variables are assigned values as described above +-(@pxref{Bash Variables}). ++When the command or function is invoked, the @env{COMP_LINE}, ++@env{COMP_POINT}, @env{COMP_KEY}, and @env{COMP_TYPE} variables are ++assigned values as described above (@pxref{Bash Variables}). + If a shell function is being invoked, the @env{COMP_WORDS} and + @env{COMP_CWORD} variables are also set. + When the function or command is invoked, the first argument is the +@@ -1570,7 +1703,7 @@ the matches. + + Any function specified with @option{-F} is invoked first. + The function may use any of the shell facilities, including the +-@code{compgen} builtin described below ++@code{compgen} and @code{compopt} builtins described below + (@pxref{Programmable Completion Builtins}), to generate the matches. + It must put the possible completions in the @env{COMPREPLY} array + variable. +@@ -1622,6 +1755,30 @@ to completed names which are symbolic links to directories, subject to + the value of the @var{mark-directories} Readline variable, regardless + of the setting of the @var{mark-symlinked-directories} Readline variable. + ++There is some support for dynamically modifying completions. This is ++most useful when used in combination with a default completion specified ++with @option{-D}. It's possible for shell functions executed as completion ++handlers to indicate that completion should be retried by returning an ++exit status of 124. If a shell function returns 124, and changes ++the compspec associated with the command on which completion is being ++attempted (supplied as the first argument when the function is executed), ++programmable completion restarts from the beginning, with an ++attempt to find a new compspec for that command. This allows a set of ++completions to be built dynamically as completion is attempted, rather than ++being loaded all at once. ++ ++For instance, assuming that there is a library of compspecs, each kept in a ++file corresponding to the name of the command, the following default ++completion function would load completions dynamically: ++ ++@example ++_completion_loader() ++@{ ++ . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124 ++@} ++complete -D -F _completion_loader ++@end example ++ + @node Programmable Completion Builtins + @section Programmable Completion Builtins + @cindex completion builtins +@@ -1657,10 +1814,10 @@ matches were generated. + @item complete + @btindex complete + @example +-@code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}] +-[-P @var{prefix}] [-S @var{suffix}] [-X @var{filterpat}] [-F @var{function}] +-[-C @var{command}] @var{name} [@var{name} @dots{}]} +-@code{complete -pr [@var{name} @dots{}]} ++@code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-DE] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}] ++[-F @var{function}] [-C @var{command}] [-X @var{filterpat}] ++[-P @var{prefix}] [-S @var{suffix}] @var{name} [@var{name} @dots{}]} ++@code{complete -pr [-DE] [@var{name} @dots{}]} + @end example + + Specify how arguments to each @var{name} should be completed. +@@ -1670,9 +1827,16 @@ reused as input. + The @option{-r} option removes a completion specification for + each @var{name}, or, if no @var{name}s are supplied, all + completion specifications. ++The @option{-D} option indicates that the remaining options and actions should ++apply to the ``default'' command completion; that is, completion attempted ++on a command for which no completion has previously been defined. ++The @option{-E} option indicates that the remaining options and actions should ++apply to ``empty'' command completion; that is, completion attempted on a ++blank line. + + The process of applying these completion specifications when word completion +-is attempted is described above (@pxref{Programmable Completion}). ++is attempted is described above (@pxref{Programmable Completion}). The ++@option{-D} option takes precedence over @option{-E}. + + Other options, if specified, have the following meanings. + The arguments to the @option{-G}, @option{-W}, and @option{-X} options +@@ -1702,9 +1866,10 @@ Perform directory name completion if the compspec generates no matches. + + @item filenames + Tell Readline that the compspec generates filenames, so it can perform any +-filename-specific processing (like adding a slash to directory names or +-suppressing trailing spaces). This option is intended to be used with +-shell functions specified with @option{-F}. ++filename-specific processing (like adding a slash to directory names ++quoting special characters, or suppressing trailing spaces). ++This option is intended to be used with shell functions specified ++with @option{-F}. + + @item nospace + Tell Readline not to append a space (the default) to words completed at +@@ -1798,17 +1963,6 @@ User names. May also be specified as @option{-u}. + Names of all shell variables. May also be specified as @option{-v}. + @end table + +-@item -G @var{globpat} +-The filename expansion pattern @var{globpat} is expanded to generate +-the possible completions. +- +-@item -W @var{wordlist} +-The @var{wordlist} is split using the characters in the +-@env{IFS} special variable as delimiters, and each resultant word +-is expanded. +-The possible completions are the members of the resultant list which +-match the word being completed. +- + @item -C @var{command} + @var{command} is executed in a subshell environment, and its output is + used as the possible completions. +@@ -1819,13 +1973,9 @@ environment. + When it finishes, the possible completions are retrieved from the value + of the @env{COMPREPLY} array variable. + +-@item -X @var{filterpat} +-@var{filterpat} is a pattern as used for filename expansion. +-It is applied to the list of possible completions generated by the +-preceding options and arguments, and each completion matching +-@var{filterpat} is removed from the list. +-A leading @samp{!} in @var{filterpat} negates the pattern; in this +-case, any completion not matching @var{filterpat} is removed. ++@item -G @var{globpat} ++The filename expansion pattern @var{globpat} is expanded to generate ++the possible completions. + + @item -P @var{prefix} + @var{prefix} is added at the beginning of each possible completion +@@ -1834,6 +1984,21 @@ after all other options have been applied. + @item -S @var{suffix} + @var{suffix} is appended to each possible completion + after all other options have been applied. ++ ++@item -W @var{wordlist} ++The @var{wordlist} is split using the characters in the ++@env{IFS} special variable as delimiters, and each resultant word ++is expanded. ++The possible completions are the members of the resultant list which ++match the word being completed. ++ ++@item -X @var{filterpat} ++@var{filterpat} is a pattern as used for filename expansion. ++It is applied to the list of possible completions generated by the ++preceding options and arguments, and each completion matching ++@var{filterpat} is removed from the list. ++A leading @samp{!} in @var{filterpat} negates the pattern; in this ++case, any completion not matching @var{filterpat} is removed. + @end table + + The return value is true unless an invalid option is supplied, an option +@@ -1842,5 +2007,31 @@ argument, an attempt is made to remove a completion specification for + a @var{name} for which no specification exists, or + an error occurs adding a completion specification. + ++@item compopt ++@btindex compopt ++@example ++@code{compopt} [-o @var{option}] [-DE] [+o @var{option}] [@var{name}] ++@end example ++Modify completion options for each @var{name} according to the ++@var{option}s, or for the currently-executing completion if no @var{name}s ++are supplied. ++If no @var{option}s are given, display the completion options for each ++@var{name} or the current completion. ++The possible values of @var{option} are those valid for the @code{complete} ++builtin described above. ++The @option{-D} option indicates that the remaining options should ++apply to the ``default'' command completion; that is, completion attempted ++on a command for which no completion has previously been defined. ++The @option{-E} option indicates that the remaining options should ++apply to ``empty'' command completion; that is, completion attempted on a ++blank line. ++ ++The @option{-D} option takes precedence over @option{-E}. ++ ++The return value is true unless an invalid option is supplied, an attempt ++is made to modify the options for a @var{name} for which no completion ++specification exists, or an output error occurs. ++ + @end table ++ + @end ifset +--- a/readline/doc/rluserman.texi ++++ b/readline/doc/rluserman.texi +@@ -4,8 +4,6 @@ + @settitle GNU Readline Library + @comment %**end of header (This is for running Texinfo on a region.) + +-@setchapternewpage odd +- + @include version.texi + + @copying +@@ -14,7 +12,7 @@ This manual describes the end user interface of the GNU Readline Library + consistency of user interface across discrete programs which provide + a command line interface. + +-Copyright @copyright{} 1988-2005 Free Software Foundation, Inc. ++Copyright @copyright{} 1988--2011 Free Software Foundation, Inc. + + Permission is granted to make and distribute verbatim copies of + this manual provided the copyright notice and this permission notice +@@ -22,15 +20,16 @@ are preserved on all copies. + + @quotation + Permission is granted to copy, distribute and/or modify this document +-under the terms of the GNU Free Documentation License, Version 1.1 or ++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, with the Front-Cover texts being ``A GNU Manual,'' ++Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', + and with the Back-Cover Texts as in (a) below. A copy of the license is +-included in the section entitled ``GNU Free Documentation License.'' ++included in the section entitled ``GNU Free Documentation License''. ++ ++(a) The FSF's Back-Cover Text is: You are free to copy and modify ++this GNU manual. Buying copies from GNU Press supports the FSF in ++developing GNU and promoting software freedom.'' + +-(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify +-this GNU Manual, like GNU software. Copies published by the Free +-Software Foundation raise funds for GNU development.'' + @end quotation + @end copying + +@@ -70,18 +69,14 @@ programs which provide a command line interface. + + @menu + * Command Line Editing:: GNU Readline User's Manual. +-* Copying This Manual:: Copying This Manual. ++* GNU Free Documentation License:: License for copying this manual. + @end menu + @end ifnottex + + @include rluser.texi + +-@node Copying This Manual +-@appendix Copying This Manual +- +-@menu +-* GNU Free Documentation License:: License for copying this manual. +-@end menu ++@node GNU Free Documentation License ++@appendix GNU Free Documentation License + + @include fdl.texi + +--- a/readline/doc/texi2dvi ++++ b/readline/doc/texi2dvi +@@ -5,20 +5,18 @@ + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, + # 2002, 2003 Free Software Foundation, Inc. + # +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# This program is free software: you can 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. ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. + # +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, you can either send email to this +-# program's maintainer or write to: The Free Software Foundation, +-# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . + # + # Original author: Noah Friedman . + # +--- a/readline/doc/texi2html ++++ b/readline/doc/texi2html +@@ -7,20 +7,19 @@ + # + # Copyright (C) 1999, 2000 Free Software Foundation, Inc. + # +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or +-# (at your option) any later version. ++# This program is free software: you can 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. ++# 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 . + # +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-# + #-############################################################################## + + # This requires perl version 5 or higher +@@ -3564,7 +3563,7 @@ INPUT_LINE: while ($_ = &next_line) { + $name = &normalise_node($name); + $level = $sec2level{$tag}; + # check for index +- $first_index_chapter = $name ++ $first_index_chapter = $node + if ($level == 1 && !$first_index_chapter && + $name =~ /index/i); + if ($in_top && /heading/){ +--- a/readline/doc/version.texi ++++ b/readline/doc/version.texi +@@ -1,10 +1,10 @@ + @ignore +-Copyright (C) 1988-2005 Free Software Foundation, Inc. ++Copyright (C) 1988-2011 Free Software Foundation, Inc. + @end ignore + +-@set EDITION 5.1-beta1 +-@set VERSION 5.1-beta1 +-@set UPDATED 11 November 2005 +-@set UPDATED-MONTH November 2005 ++@set EDITION 6.2 ++@set VERSION 6.2 ++@set UPDATED September 6 2010 ++@set UPDATED-MONTH September 2010 + +-@set LASTCHANGE Fri Nov 11 19:50:51 EST 2005 ++@set LASTCHANGE Mon Sep 6 22:07:10 EDT 2010 +--- a/readline/emacs_keymap.c ++++ b/readline/emacs_keymap.c +@@ -1,24 +1,23 @@ + /* emacs_keymap.c -- the keymap for emacs_mode in readline (). */ + +-/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (BUFSIZ) + #include +--- a/readline/examples/ChangeLog.gdb ++++ b/readline/examples/ChangeLog.gdb +@@ -1,3 +1,7 @@ ++2011-04-25 Jan Kratochvil ++ ++ Imported readline 6.2, and upstream patch 001. ++ + 2006-04-24 Daniel Jacobowitz + + Imported readline 5.1, and upstream patches 001-004. +--- a/readline/examples/Inputrc ++++ b/readline/examples/Inputrc +@@ -4,21 +4,21 @@ + # on which program is running, or what terminal is active. + # + +-# Copyright (C) 1989-2002 Free Software Foundation, Inc. ++# Copyright (C) 1989-2009 Free Software Foundation, Inc. + # +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# 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. ++# 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 . + # +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + + # In all programs, all terminals, make sure this is bound. + "\C-x\C-r": re-read-init-file +--- a/readline/examples/Makefile.in ++++ b/readline/examples/Makefile.in +@@ -1,30 +1,46 @@ + # + # This is the Makefile for the readline examples subdirectory. + # +-# Copyright (C) 1994 Free Software Foundation, Inc. ++# Copyright (C) 1994,2008,2009 Free Software Foundation, Inc. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# 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. ++# 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 . + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + RL_LIBRARY_VERSION = @LIBVERSION@ + + SHELL = @MAKE_SHELL@ + RM = rm -f + ++prefix = @prefix@ ++exec_prefix = @exec_prefix@ ++ ++datarootdir = @datarootdir@ ++ ++bindir = @bindir@ + srcdir = @srcdir@ +-VPATH = .:@srcdir@ ++datadir = @datadir@ ++VPATH = @srcdir@ + top_srcdir = @top_srcdir@ +-BUILD_DIR = . ++#BUILD_DIR = . ++BUILD_DIR = @BUILD_DIR@ ++installdir = $(datadir)/readline ++ ++INSTALL = @INSTALL@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_DATA = @INSTALL_DATA@ ++ ++EXEEXT = @EXEEXT@ ++OBJEXT = @OBJEXT@ + + # Support an alternate destination root directory for package building + DESTDIR = +@@ -51,31 +67,56 @@ TERMCAP_LIB = @TERMCAP_LIB@ + ${RM} $@ + $(CC) $(CCFLAGS) -c $< + +-EXECUTABLES = fileman rltest rl rlcat rlversion histexamp +-OBJECTS = fileman.o rltest.o rl.o rlcat.o rlversion.o histexamp.o ++SOURCES = excallback.c fileman.c histexamp.c manexamp.c rl-fgets.c rl.c \ ++ rlcat.c rlevent.c rlptytest.c rltest.c rlversion.c ++ ++EXECUTABLES = fileman$(EXEEXT) rltest$(EXEEXT) rl$(EXEEXT) rlcat$(EXEEXT) \ ++ rlevent$(EXEEXT) rlversion$(EXEEXT) histexamp$(EXEEXT) ++OBJECTS = fileman.o rltest.o rl.o rlevent.o rlcat.o rlversion.o histexamp.o + + all: $(EXECUTABLES) + everything: all + +-rl: rl.o $(READLINE_LIB) ++check: rlversion$(EXEEXT) ++ @echo Readline version: `rlversion$(EXEEXT)` ++ ++installdirs: ++ -$(SHELL) $(top_srcdir)/support/mkdirs $(DESTDIR)$(installdir) ++ ++install: installdirs ++ @for f in $(SOURCES); do \ ++ $(RM) $(DESTDIR)$(installdir)/$$f ; \ ++ $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(installdir) ; \ ++ done ++ ++uninstall: ++ @for f in $(SOURCES); do \ ++ $(RM) $(DESTDIR)$(installdir)/$$f ; \ ++ done ++ -rmdir $(DESTDIR)$(installdir) ++ ++rl$(EXEEXT): rl.o $(READLINE_LIB) + $(PURIFY) $(CC) $(LDFLAGS) -o $@ rl.o $(READLINE_LIB) $(TERMCAP_LIB) + +-rlcat: rlcat.o $(READLINE_LIB) ++rlcat$(EXEEXT): rlcat.o $(READLINE_LIB) + $(PURIFY) $(CC) $(LDFLAGS) -o $@ rlcat.o $(READLINE_LIB) $(TERMCAP_LIB) + +-fileman: fileman.o $(READLINE_LIB) ++rlevent$(EXEEXT): rlevent.o $(READLINE_LIB) ++ $(PURIFY) $(CC) $(LDFLAGS) -o $@ rlevent.o $(READLINE_LIB) $(TERMCAP_LIB) ++ ++fileman$(EXEEXT): fileman.o $(READLINE_LIB) + $(PURIFY) $(CC) $(LDFLAGS) -o $@ fileman.o $(READLINE_LIB) $(TERMCAP_LIB) + +-rltest: rltest.o $(READLINE_LIB) ++rltest$(EXEEXT): rltest.o $(READLINE_LIB) + $(PURIFY) $(CC) $(LDFLAGS) -o $@ rltest.o $(READLINE_LIB) $(TERMCAP_LIB) + +-rlptytest: rlptytest.o $(READLINE_LIB) ++rlptytest$(EXEEXT): rlptytest.o $(READLINE_LIB) + $(PURIFY) $(CC) $(LDFLAGS) -o $@ rlptytest.o $(READLINE_LIB) $(TERMCAP_LIB) + +-rlversion: rlversion.o $(READLINE_LIB) ++rlversion$(EXEEXT): rlversion.o $(READLINE_LIB) + $(CC) $(LDFLAGS) -o $@ rlversion.o $(READLINE_LIB) $(TERMCAP_LIB) + +-histexamp: histexamp.o $(HISTORY_LIB) ++histexamp$(EXEEXT): histexamp.o $(HISTORY_LIB) + $(PURIFY) $(CC) $(LDFLAGS) -o $@ histexamp.o -lhistory $(TERMCAP_LIB) + + clean mostlyclean: +--- /dev/null ++++ b/readline/examples/autoconf/BASH_CHECK_LIB_TERMCAP +@@ -0,0 +1,40 @@ ++AC_DEFUN([BASH_CHECK_LIB_TERMCAP], ++[ ++if test "X$bash_cv_termcap_lib" = "X"; then ++_bash_needmsg=yes ++else ++AC_MSG_CHECKING(which library has the termcap functions) ++_bash_needmsg= ++fi ++AC_CACHE_VAL(bash_cv_termcap_lib, ++[AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc, ++ [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap, ++ [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo, ++ [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses, ++ [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses, ++ bash_cv_termcap_lib=gnutermcap)])])])])]) ++if test "X$_bash_needmsg" = "Xyes"; then ++AC_MSG_CHECKING(which library has the termcap functions) ++fi ++AC_MSG_RESULT(using $bash_cv_termcap_lib) ++if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then ++LDFLAGS="$LDFLAGS -L./lib/termcap" ++TERMCAP_LIB="./lib/termcap/libtermcap.a" ++TERMCAP_DEP="./lib/termcap/libtermcap.a" ++elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then ++TERMCAP_LIB=-ltermcap ++TERMCAP_DEP= ++elif test $bash_cv_termcap_lib = libtinfo; then ++TERMCAP_LIB=-ltinfo ++TERMCAP_DEP= ++elif test $bash_cv_termcap_lib = libncurses; then ++TERMCAP_LIB=-lncurses ++TERMCAP_DEP= ++elif test $bash_cv_termcap_lib = libc; then ++TERMCAP_LIB= ++TERMCAP_DEP= ++else ++TERMCAP_LIB=-lcurses ++TERMCAP_DEP= ++fi ++]) +--- /dev/null ++++ b/readline/examples/autoconf/RL_LIB_READLINE_VERSION +@@ -0,0 +1,118 @@ ++dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB ++dnl require: ++dnl AC_PROG_CC ++dnl BASH_CHECK_LIB_TERMCAP ++ ++AC_DEFUN([RL_LIB_READLINE_VERSION], ++[ ++AC_REQUIRE([BASH_CHECK_LIB_TERMCAP]) ++ ++AC_MSG_CHECKING([version of installed readline library]) ++ ++# What a pain in the ass this is. ++ ++# save cpp and ld options ++_save_CFLAGS="$CFLAGS" ++_save_LDFLAGS="$LDFLAGS" ++_save_LIBS="$LIBS" ++ ++# Don't set ac_cv_rl_prefix if the caller has already assigned a value. This ++# allows the caller to do something like $_rl_prefix=$withval if the user ++# specifies --with-installed-readline=PREFIX as an argument to configure ++ ++if test -z "$ac_cv_rl_prefix"; then ++test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix} ++fi ++ ++eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include ++eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib ++ ++LIBS="$LIBS -lreadline ${TERMCAP_LIB}" ++CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}" ++LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}" ++ ++AC_CACHE_VAL(ac_cv_rl_version, ++[AC_TRY_RUN([ ++#include ++#include ++ ++extern int rl_gnu_readline_p; ++ ++main() ++{ ++ FILE *fp; ++ fp = fopen("conftest.rlv", "w"); ++ if (fp == 0) ++ exit(1); ++ if (rl_gnu_readline_p != 1) ++ fprintf(fp, "0.0\n"); ++ else ++ fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0"); ++ fclose(fp); ++ exit(0); ++} ++], ++ac_cv_rl_version=`cat conftest.rlv`, ++ac_cv_rl_version='0.0', ++ac_cv_rl_version='4.2')]) ++ ++CFLAGS="$_save_CFLAGS" ++LDFLAGS="$_save_LDFLAGS" ++LIBS="$_save_LIBS" ++ ++RL_MAJOR=0 ++RL_MINOR=0 ++ ++# ( ++case "$ac_cv_rl_version" in ++2*|3*|4*|5*|6*|7*|8*|9*) ++ RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'` ++ RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'` ++ ;; ++esac ++ ++# ((( ++case $RL_MAJOR in ++[[0-9][0-9]]) _RL_MAJOR=$RL_MAJOR ;; ++[[0-9]]) _RL_MAJOR=0$RL_MAJOR ;; ++*) _RL_MAJOR=00 ;; ++esac ++ ++# ((( ++case $RL_MINOR in ++[[0-9][0-9]]) _RL_MINOR=$RL_MINOR ;; ++[[0-9]]) _RL_MINOR=0$RL_MINOR ;; ++*) _RL_MINOR=00 ;; ++esac ++ ++RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}" ++ ++# Readline versions greater than 4.2 have these defines in readline.h ++ ++if test $ac_cv_rl_version = '0.0' ; then ++ AC_MSG_WARN([Could not test version of installed readline library.]) ++elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then ++ # set these for use by the caller ++ RL_PREFIX=$ac_cv_rl_prefix ++ RL_LIBDIR=$ac_cv_rl_libdir ++ RL_INCLUDEDIR=$ac_cv_rl_includedir ++ AC_MSG_RESULT($ac_cv_rl_version) ++else ++ ++AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library]) ++AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library]) ++AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library]) ++ ++AC_SUBST(RL_VERSION) ++AC_SUBST(RL_MAJOR) ++AC_SUBST(RL_MINOR) ++ ++# set these for use by the caller ++RL_PREFIX=$ac_cv_rl_prefix ++RL_LIBDIR=$ac_cv_rl_libdir ++RL_INCLUDEDIR=$ac_cv_rl_includedir ++ ++AC_MSG_RESULT($ac_cv_rl_version) ++ ++fi ++]) +--- /dev/null ++++ b/readline/examples/autoconf/wi_LIB_READLINE +@@ -0,0 +1,76 @@ ++dnl Borut Razem ++dnl ++dnl This macro checks for the presence of the readline library. ++dnl It works also in cross-compilation environment. ++dnl ++dnl To get it into the aclocal.m4 dnl file, do this: ++dnl aclocal -I . --verbose ++dnl ++dnl The --verbose will show all of the files that are searched ++dnl for .m4 macros. ++ ++AC_DEFUN([wi_LIB_READLINE], [ ++ dnl check for the readline.h header file ++ ++ AC_CHECK_HEADER(readline/readline.h) ++ ++ if test "$ac_cv_header_readline_readline_h" = yes; then ++ dnl check the readline version ++ ++ cat > conftest.$ac_ext < ++#include ++wi_LIB_READLINE_VERSION RL_VERSION_MAJOR RL_VERSION_MINOR ++EOF ++ ++ wi_READLINE_VERSION=$($CPP $CPPFLAGS conftest.$ac_ext | sed -n -e "s/^wi_LIB_READLINE_VERSION *\([[0-9\]][[0-9\]]*\) *\([[0-9\]][[0-9\]]*\)$/\1.\2/p") ++ rm -rf conftest* ++ ++ if test -n "$wi_READLINE_VERSION"; then ++ wi_MAJOR=$(expr $wi_READLINE_VERSION : '\([[0-9]][[0-9]]*\)\.') ++ wi_MINOR=$(expr $wi_READLINE_VERSION : '[[0-9]][[0-9]]*\.\([[0-9]][[0-9]]*$\)') ++ if test $wi_MINOR -lt 10; then ++ wi_MINOR=$(expr $wi_MINOR \* 10) ++ fi ++ wi_READLINE_VERSION=$(expr $wi_MAJOR \* 100 + $wi_MINOR) ++ else ++ wi_READLINE_VERSION=-1 ++ fi ++ ++ dnl check for the readline library ++ ++ ac_save_LIBS="$LIBS" ++ # Note: $LIBCURSES is permitted to be empty. ++ ++ for LIBREADLINE in "-lreadline.dll" "-lreadline" "-lreadline $LIBCURSES" "-lreadline -ltermcap" "-lreadline -lncurses" "-lreadline -lcurses" ++ do ++ AC_MSG_CHECKING([for GNU Readline library $LIBREADLINE]) ++ ++ LIBS="$ac_save_LIBS $LIBREADLINE" ++ ++ AC_TRY_LINK([ ++ /* includes */ ++ #include ++ #include ++ ],[ ++ /* function-body */ ++ int dummy = rl_completion_append_character; /* rl_completion_append_character appeared in version 2.1 */ ++ readline(NULL); ++ ],[ ++ wi_cv_lib_readline=yes ++ AC_MSG_RESULT(yes) ++ ],[ ++ wi_cv_lib_readline=no ++ AC_MSG_RESULT(no) ++ ]) ++ ++ if test "$wi_cv_lib_readline" = yes; then ++ AC_SUBST(LIBREADLINE) ++ AC_DEFINE_UNQUOTED(HAVE_LIBREADLINE, $wi_READLINE_VERSION, [Readline]) ++ break ++ fi ++ done ++ ++ LIBS="$ac_save_LIBS" ++ fi ++]) +--- a/readline/examples/excallback.c ++++ b/readline/examples/excallback.c +@@ -32,6 +32,9 @@ Let me know what you think. + + Jeff + */ ++/* ++Copyright (C) 1999 Jeff Solomon ++*/ + + #if defined (HAVE_CONFIG_H) + #include +--- a/readline/examples/fileman.c ++++ b/readline/examples/fileman.c +@@ -1,22 +1,23 @@ +-/* Copyright (C) 1987-2002 Free Software Foundation, Inc. ++/* fileman.c - file manager example for readline library. */ + +- This file is part of the GNU Readline Library, a library for ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. ++ ++ This file is part of the GNU Readline Library (Readline), a library for + reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + /* fileman.c -- A tiny application which demonstrates how to use the + GNU Readline library. This application interactively allows users +@@ -50,6 +51,8 @@ + # include + #endif + ++#include ++ + #ifdef READLINE_LIBRARY + # include "readline.h" + # include "history.h" +@@ -58,7 +61,7 @@ + # include + #endif + +-extern char *xmalloc (); ++extern char *xmalloc PARAMS((size_t)); + + /* The names of functions that actually do the manipulation. */ + int com_list PARAMS((char *)); +--- a/readline/examples/histexamp.c ++++ b/readline/examples/histexamp.c +@@ -1,22 +1,23 @@ +-/* Copyright (C) 1987-2002 Free Software Foundation, Inc. ++/* histexamp.c - history library example program. */ + +- This file is part of the GNU Readline Library, a library for ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. ++ ++ This file is part of the GNU Readline Library (Readline), a library for + reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #include + +--- a/readline/examples/manexamp.c ++++ b/readline/examples/manexamp.c +@@ -1,24 +1,23 @@ + /* manexamp.c -- The examples which appear in the documentation are here. */ + +-/* Copyright (C) 1987-2002 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for ++ This file is part of the GNU Readline Library (Readline), a library for + reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #include + #include +--- a/readline/examples/readlinebuf.h ++++ b/readline/examples/readlinebuf.h +@@ -8,7 +8,7 @@ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation; either version 2 of the License, or ++ * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, +--- a/readline/examples/rl.c ++++ b/readline/examples/rl.c +@@ -5,25 +5,24 @@ + * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] + */ + +-/* Copyright (C) 1987-2002 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for ++ This file is part of the GNU Readline Library (Readline), a library for + reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if defined (HAVE_CONFIG_H) + # include +--- a/readline/examples/rlcat.c ++++ b/readline/examples/rlcat.c +@@ -4,25 +4,24 @@ + * usage: rlcat + */ + +-/* Copyright (C) 1987-2002 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for ++ This file is part of the GNU Readline Library (Readline), a library for + reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if defined (HAVE_CONFIG_H) + # include +--- /dev/null ++++ b/readline/examples/rlevent.c +@@ -0,0 +1,166 @@ ++/* ++ * rl - command-line interface to read a line from the standard input ++ * (or another fd) using readline. ++ * ++ * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars] ++ */ ++ ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. ++ ++ This file is part of the GNU Readline Library (Readline), a library for ++ reading lines of text with interactive input and history editing. ++ ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ ++#if defined (HAVE_CONFIG_H) ++# include ++#endif ++ ++#include ++#include ++ ++#ifdef HAVE_STDLIB_H ++# include ++#else ++extern void exit(); ++#endif ++ ++#if defined (READLINE_LIBRARY) ++# include "posixstat.h" ++# include "readline.h" ++# include "history.h" ++#else ++# include ++# include ++# include ++#endif ++ ++extern int optind; ++extern char *optarg; ++ ++#if !defined (strchr) && !defined (__STDC__) ++extern char *strrchr(); ++#endif ++ ++static char *progname; ++static char *deftext; ++ ++static int ++event_hook () ++{ ++ fprintf (stderr, "ding!\n"); ++ sleep (1); ++ return 0; ++} ++ ++static int ++set_deftext () ++{ ++ if (deftext) ++ { ++ rl_insert_text (deftext); ++ deftext = (char *)NULL; ++ rl_startup_hook = (rl_hook_func_t *)NULL; ++ } ++ return 0; ++} ++ ++static void ++usage() ++{ ++ fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", ++ progname, progname); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ char *temp, *prompt; ++ struct stat sb; ++ int opt, fd, nch; ++ FILE *ifp; ++ ++ progname = strrchr(argv[0], '/'); ++ if (progname == 0) ++ progname = argv[0]; ++ else ++ progname++; ++ ++ /* defaults */ ++ prompt = "readline$ "; ++ fd = nch = 0; ++ deftext = (char *)0; ++ ++ while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF) ++ { ++ switch (opt) ++ { ++ case 'p': ++ prompt = optarg; ++ break; ++ case 'u': ++ fd = atoi(optarg); ++ if (fd < 0) ++ { ++ fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg); ++ exit (2); ++ } ++ break; ++ case 'd': ++ deftext = optarg; ++ break; ++ case 'n': ++ nch = atoi(optarg); ++ if (nch < 0) ++ { ++ fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg); ++ exit (2); ++ } ++ break; ++ default: ++ usage (); ++ exit (2); ++ } ++ } ++ ++ if (fd != 0) ++ { ++ if (fstat (fd, &sb) < 0) ++ { ++ fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd); ++ exit (1); ++ } ++ ifp = fdopen (fd, "r"); ++ rl_instream = ifp; ++ } ++ ++ if (deftext && *deftext) ++ rl_startup_hook = set_deftext; ++ ++ if (nch > 0) ++ rl_num_chars_to_read = nch; ++ ++ rl_event_hook = event_hook; ++ temp = readline (prompt); ++ ++ /* Test for EOF. */ ++ if (temp == 0) ++ exit (1); ++ ++ printf ("%s\n", temp); ++ exit (0); ++} +--- a/readline/examples/rlfe/ChangeLog ++++ b/readline/examples/rlfe/ChangeLog +@@ -1,14 +1,3 @@ +-2009-08-22 Ralf Wildenhues +- +- * configure: Regenerate. +- +- * configure.in: m4_include toplevel config/override.m4. +- * configure: Regenerate. +- +-2009-07-30 Ralf Wildenhues +- +- * configure.in: Correctly quote AC_PROGRAM_SOURCE definition. +- + 2004-11-04 Per Bothner + + * pty.c: Import from screen-4.0.2. +--- a/readline/examples/rlfe/Makefile.in ++++ b/readline/examples/rlfe/Makefile.in +@@ -25,7 +25,7 @@ CFLAGS = @CFLAGS@ + CPPFLAGS = @CPPFLAGS@ + #LDFLAGS = -L$(READLINE_DIR) + LDFLAGS = @LDFLAGS@ +-LIBS = -lreadline -lhistory -lncurses ++LIBS = -lreadline -lhistory @LIBS@ + + CPP=@CPP@ + CPP_DEPEND=$(CC) -MM +@@ -55,7 +55,7 @@ rlfe-$(VERSION).tar.gz: + tar czf $@ $(CFILES) $(HFILES) $(EXTRA_DIST) + + .c.o: +- $(CC) -c -I. -I$(srcdir) $(M_CFLAGS) $(DEFS) $(OPTIONS) $(CFLAGS) $< ++ $(CC) -c -I. -I$(srcdir) $(CPPFLAGS) $(M_CFLAGS) $(DEFS) $(OPTIONS) $(CFLAGS) $< + + install_bin: .version screen + -if [ -f $(DESTDIR)$(bindir)/$(SCREEN) ] && [ ! -f $(DESTDIR)$(bindir)/$(SCREEN).old ]; \ +@@ -68,7 +68,6 @@ install_bin: .version screen + (cd $(DESTDIR)$(bindir) && ln -sf $(SCREEN) screen) + cp $(srcdir)/utf8encodings/?? $(DESTDIR)$(SCREENENCODINGS) + +- + uninstall: .version + rm -f $(DESTDIR)$(bindir)/$(SCREEN) + rm -f $(DESTDIR)$(bindir)/screen +@@ -170,6 +169,15 @@ depend.in: $(CFILES) term.h + for i in $(CFILES); do echo $$i; $(CPP_DEPEND) $$i >> tmp_make; done + mv tmp_make Makefile.in + ++Makefile makefile: config.status $(srcdir)/Makefile.in ++ CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status ++ ++config.status: $(srcdir)/configure ++ $(SHELL) ./config.status --recheck ++ ++$(srcdir)/configure: $(srcdir)/configure.in ++ cd $(srcdir) && autoconf ++ + ############################################################################### + + ### Dependencies: +--- a/readline/examples/rlfe/config.h.in ++++ b/readline/examples/rlfe/config.h.in +@@ -373,3 +373,7 @@ + #undef PTYRANGE1 + + #define USEVARARGS ++ ++#undef HAVE_SYS_STROPTS_H ++ ++#undef HAVE_SYS_WAIT_H +--- a/readline/examples/rlfe/configure ++++ b/readline/examples/rlfe/configure +@@ -552,6 +552,42 @@ PACKAGE_BUGREPORT= + PACKAGE_URL= + + ac_unique_file="rlfe.c" ++# Factoring default headers for most tests. ++ac_includes_default="\ ++#include ++#ifdef HAVE_SYS_TYPES_H ++# include ++#endif ++#ifdef HAVE_SYS_STAT_H ++# include ++#endif ++#ifdef STDC_HEADERS ++# include ++# include ++#else ++# ifdef HAVE_STDLIB_H ++# include ++# endif ++#endif ++#ifdef HAVE_STRING_H ++# if !defined STDC_HEADERS && defined HAVE_MEMORY_H ++# include ++# endif ++# include ++#endif ++#ifdef HAVE_STRINGS_H ++# include ++#endif ++#ifdef HAVE_INTTYPES_H ++# include ++#endif ++#ifdef HAVE_STDINT_H ++# include ++#endif ++#ifdef HAVE_UNISTD_H ++# include ++#endif" ++ + ac_subst_vars='LTLIBOBJS + LIBOBJS + XTERMPATH +@@ -1550,6 +1586,124 @@ $as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + + } # ac_fn_c_check_func ++ ++# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES ++# ------------------------------------------------------- ++# Tests whether HEADER exists, giving a warning if it cannot be compiled using ++# the include files in INCLUDES and setting the cache variable VAR ++# accordingly. ++ac_fn_c_check_header_mongrel () ++{ ++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++$as_echo_n "checking for $2... " >&6; } ++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++ $as_echo_n "(cached) " >&6 ++fi ++eval ac_res=\$$3 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++else ++ # Is the header compilable? ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 ++$as_echo_n "checking $2 usability... " >&6; } ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++#include <$2> ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_header_compiler=yes ++else ++ ac_header_compiler=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 ++$as_echo "$ac_header_compiler" >&6; } ++ ++# Is the header present? ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 ++$as_echo_n "checking $2 presence... " >&6; } ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include <$2> ++_ACEOF ++if ac_fn_c_try_cpp "$LINENO"; then : ++ ac_header_preproc=yes ++else ++ ac_header_preproc=no ++fi ++rm -f conftest.err conftest.$ac_ext ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 ++$as_echo "$ac_header_preproc" >&6; } ++ ++# So? What about this header? ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( ++ yes:no: ) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 ++$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 ++$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ++ ;; ++ no:yes:* ) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 ++$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 ++$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 ++$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 ++$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} ++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 ++$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ++ ;; ++esac ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++$as_echo_n "checking for $2... " >&6; } ++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++ $as_echo_n "(cached) " >&6 ++else ++ eval "$3=\$ac_header_compiler" ++fi ++eval ac_res=\$$3 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++fi ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ ++} # ac_fn_c_check_header_mongrel ++ ++# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES ++# ------------------------------------------------------- ++# Tests whether HEADER exists and can be compiled using the include files in ++# INCLUDES, setting the cache variable VAR accordingly. ++ac_fn_c_check_header_compile () ++{ ++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++$as_echo_n "checking for $2... " >&6; } ++if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$4 ++#include <$2> ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ eval "$3=yes" ++else ++ eval "$3=no" ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++fi ++eval ac_res=\$$3 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++$as_echo "$ac_res" >&6; } ++ eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ ++} # ac_fn_c_check_header_compile + cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. +@@ -4003,6 +4157,151 @@ fi + + fi + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 ++$as_echo_n "checking for ANSI C header files... " >&6; } ++if test "${ac_cv_header_stdc+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++#include ++#include ++#include ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_header_stdc=yes ++else ++ ac_cv_header_stdc=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ ++if test $ac_cv_header_stdc = yes; then ++ # SunOS 4.x string.h does not declare mem*, contrary to ANSI. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "memchr" >/dev/null 2>&1; then : ++ ++else ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++ ++_ACEOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | ++ $EGREP "free" >/dev/null 2>&1; then : ++ ++else ++ ac_cv_header_stdc=no ++fi ++rm -f conftest* ++ ++fi ++ ++if test $ac_cv_header_stdc = yes; then ++ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. ++ if test "$cross_compiling" = yes; then : ++ : ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++#include ++#if ((' ' & 0x0FF) == 0x020) ++# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') ++# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) ++#else ++# define ISLOWER(c) \ ++ (('a' <= (c) && (c) <= 'i') \ ++ || ('j' <= (c) && (c) <= 'r') \ ++ || ('s' <= (c) && (c) <= 'z')) ++# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) ++#endif ++ ++#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) ++int ++main () ++{ ++ int i; ++ for (i = 0; i < 256; i++) ++ if (XOR (islower (i), ISLOWER (i)) ++ || toupper (i) != TOUPPER (i)) ++ return 2; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ++else ++ ac_cv_header_stdc=no ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 ++$as_echo "$ac_cv_header_stdc" >&6; } ++if test $ac_cv_header_stdc = yes; then ++ ++$as_echo "#define STDC_HEADERS 1" >>confdefs.h ++ ++fi ++ ++# On IRIX 5.3, sys/types and inttypes.h are conflicting. ++for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ ++ inttypes.h stdint.h unistd.h ++do : ++ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ++ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default ++" ++eval as_val=\$$as_ac_Header ++ if test "x$as_val" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++ ++done ++ ++ ++for ac_header in sys/stropts.h sys/wait.h ++do : ++ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ++ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" ++eval as_val=\$$as_ac_Header ++ if test "x$as_val" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++ ++done ++ ++ + ac_config_files="$ac_config_files Makefile" + + cat >confcache <<\_ACEOF +--- a/readline/examples/rlfe/configure.in ++++ b/readline/examples/rlfe/configure.in +@@ -437,4 +437,6 @@ main() + + fi + ++AC_CHECK_HEADERS(sys/stropts.h sys/wait.h) ++ + AC_OUTPUT(Makefile) +--- a/readline/examples/rlfe/extern.h ++++ b/readline/examples/rlfe/extern.h +@@ -27,7 +27,14 @@ + #define __attribute__(x) + #endif + ++#if !defined (__P) ++# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) ++# define __P(protos) protos ++# else ++# define __P(protos) () ++# endif ++#endif ++ + /* pty.c */ + extern int OpenPTY __P((char **)); + extern void InitPTY __P((int)); +- +--- a/readline/examples/rlfe/os.h ++++ b/readline/examples/rlfe/os.h +@@ -186,7 +186,7 @@ extern int errno; + * terminal handling + */ + +-#ifdef POSIX ++#if defined (POSIX) || defined (__FreeBSD__) + # include + # ifdef hpux + # include +@@ -527,4 +527,3 @@ typedef struct fd_set { int fds_bits[1]; } fd_set; + * how many characters your pty's can buffer. + */ + #define IOSIZE 4096 +- +--- a/readline/examples/rlfe/pty.c ++++ b/readline/examples/rlfe/pty.c +@@ -20,13 +20,15 @@ + * + **************************************************************** + */ ++#include "config.h" + + #include + #include + #include + #include + +-#include "config.h" ++#include ++ + #include "screen.h" + + #ifndef sun +@@ -34,7 +36,7 @@ + #endif + + /* for solaris 2.1, Unixware (SVR4.2) and possibly others */ +-#ifdef HAVE_SVR4_PTYS ++#if defined (HAVE_SVR4_PTYS) && defined (HAVE_SYS_STROPTS_H) + # include + #endif + +@@ -384,4 +386,3 @@ char **ttyn; + return -1; + } + #endif +- +--- a/readline/examples/rlfe/rlfe.c ++++ b/readline/examples/rlfe/rlfe.c +@@ -73,6 +73,11 @@ + #include + + #include "config.h" ++#include "extern.h" ++ ++#if defined (HAVE_SYS_WAIT_H) ++# include ++#endif + + #ifdef READLINE_LIBRARY + # include "readline.h" +@@ -588,7 +593,7 @@ main(int argc, char** argv) + } + if (FD_ISSET (in_from_tty_fd, &in_set)) + { +- extern int readline_echoing_p; ++ extern int _rl_echoing_p; + struct termios term_master; + int do_canon = 1; + int do_icrnl = 1; +@@ -605,9 +610,9 @@ main(int argc, char** argv) + { + do_canon = (term_master.c_lflag & ICANON) != 0; + do_icrnl = (term_master.c_lflag & ICRNL) != 0; +- readline_echoing_p = (term_master.c_lflag & ECHO) != 0; ++ _rl_echoing_p = (term_master.c_lflag & ECHO) != 0; + DPRINT1 ("echo,canon,crnl:%03d\n", +- 100 * readline_echoing_p ++ 100 * _rl_echoing_p + + 10 * do_canon + + 1 * do_icrnl); + } +@@ -757,7 +762,7 @@ static void set_edit_mode () + vi = 1; + break; + } +- shellopts = index (shellopts + 1, ':'); ++ shellopts = strchr (shellopts + 1, ':'); + } + + if (!vi) +--- a/readline/examples/rltest.c ++++ b/readline/examples/rltest.c +@@ -4,25 +4,24 @@ + /* */ + /* **************************************************************** */ + +-/* Copyright (C) 1987-2002 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for ++ This file is part of the GNU Readline Library (Readline), a library for + reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if defined (HAVE_CONFIG_H) + #include +--- a/readline/examples/rlversion.c ++++ b/readline/examples/rlversion.c +@@ -2,25 +2,24 @@ + * rlversion -- print out readline's version number + */ + +-/* Copyright (C) 1987-2002 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for ++ This file is part of the GNU Readline Library (Readline), a library for + reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if defined (HAVE_CONFIG_H) + # include +--- a/readline/funmap.c ++++ b/readline/funmap.c +@@ -1,24 +1,24 @@ + /* funmap.c -- attach names to functions. */ + +-/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2010 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -56,7 +56,7 @@ static int funmap_entry; + program specific function. */ + int funmap_program_specific_entry_start; + +-static FUNMAP default_funmap[] = { ++static const FUNMAP default_funmap[] = { + { "abort", rl_abort }, + { "accept-line", rl_newline }, + { "arrow-key-prefix", rl_arrow_keys }, +@@ -105,11 +105,13 @@ static FUNMAP default_funmap[] = { + { "kill-region", rl_kill_region }, + { "kill-word", rl_kill_word }, + { "menu-complete", rl_menu_complete }, ++ { "menu-complete-backward", rl_backward_menu_complete }, + { "next-history", rl_get_next_history }, + { "non-incremental-forward-search-history", rl_noninc_forward_search }, + { "non-incremental-reverse-search-history", rl_noninc_reverse_search }, + { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again }, + { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again }, ++ { "old-menu-complete", rl_old_menu_complete }, + { "overwrite-mode", rl_overwrite_mode }, + #ifdef __CYGWIN__ + { "paste-from-clipboard", rl_paste_from_clipboard }, +@@ -123,6 +125,7 @@ static FUNMAP default_funmap[] = { + { "revert-line", rl_revert_line }, + { "self-insert", rl_insert }, + { "set-mark", rl_set_mark }, ++ { "skip-csi-sequence", rl_skip_csi_sequence }, + { "start-kbd-macro", rl_start_kbd_macro }, + { "tab-insert", rl_tab_insert }, + { "tilde-expand", rl_tilde_expand }, +@@ -145,6 +148,8 @@ static FUNMAP default_funmap[] = { + { "vi-append-mode", rl_vi_append_mode }, + { "vi-arg-digit", rl_vi_arg_digit }, + { "vi-back-to-indent", rl_vi_back_to_indent }, ++ { "vi-backward-bigword", rl_vi_bWord }, ++ { "vi-backward-word", rl_vi_bword }, + { "vi-bWord", rl_vi_bWord }, + { "vi-bword", rl_vi_bword }, + { "vi-change-case", rl_vi_change_case }, +@@ -157,12 +162,15 @@ static FUNMAP default_funmap[] = { + { "vi-delete-to", rl_vi_delete_to }, + { "vi-eWord", rl_vi_eWord }, + { "vi-editing-mode", rl_vi_editing_mode }, ++ { "vi-end-bigword", rl_vi_eWord }, + { "vi-end-word", rl_vi_end_word }, + { "vi-eof-maybe", rl_vi_eof_maybe }, + { "vi-eword", rl_vi_eword }, + { "vi-fWord", rl_vi_fWord }, + { "vi-fetch-history", rl_vi_fetch_history }, + { "vi-first-print", rl_vi_first_print }, ++ { "vi-forward-bigword", rl_vi_fWord }, ++ { "vi-forward-word", rl_vi_fword }, + { "vi-fword", rl_vi_fword }, + { "vi-goto-mark", rl_vi_goto_mark }, + { "vi-insert-beg", rl_vi_insert_beg }, +--- a/readline/histexpand.c ++++ b/readline/histexpand.c +@@ -1,24 +1,23 @@ + /* histexpand.c -- history expansion. */ + +-/* Copyright (C) 1989-2004 Free Software Foundation, Inc. ++/* Copyright (C) 1989-2010 Free Software Foundation, Inc. + +- This file contains the GNU History Library (the Library), a set of ++ This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + +- The Library is free software; you can redistribute it and/or modify ++ History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ History is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with History. If not, see . ++*/ + + #define READLINE_LIBRARY + +@@ -56,8 +55,6 @@ + + typedef int _hist_search_func_t PARAMS((const char *, int)); + +-extern int rl_byte_oriented; /* declared in mbutil.c */ +- + static char error_pointer; + + static char *subst_lhs; +@@ -66,9 +63,11 @@ static int subst_lhs_len; + static int subst_rhs_len; + + static char *get_history_word_specifier PARAMS((char *, char *, int *)); +-static char *history_find_word PARAMS((char *, int)); + static int history_tokenize_word PARAMS((const char *, int)); ++static char **history_tokenize_internal PARAMS((const char *, int, int *)); + static char *history_substring PARAMS((const char *, int, int)); ++static void freewords PARAMS((char **, int)); ++static char *history_find_word PARAMS((char *, int)); + + static char *quote_breaks PARAMS((char *)); + +@@ -246,7 +245,7 @@ get_history_event (string, caller_index, delimiting_quote) + + #define FAIL_SEARCH() \ + do { \ +- history_offset = history_length; free (temp) ; return (char *)NULL; \ ++ history_offset = history_length; xfree (temp) ; return (char *)NULL; \ + } while (0) + + /* If there is no search string, try to use the previous search string, +@@ -255,7 +254,7 @@ get_history_event (string, caller_index, delimiting_quote) + { + if (search_string) + { +- free (temp); ++ xfree (temp); + temp = savestring (search_string); + } + else +@@ -286,7 +285,7 @@ get_history_event (string, caller_index, delimiting_quote) + search_match = history_find_word (entry->line, local_index); + } + else +- free (temp); ++ xfree (temp); + + return (entry->line); + } +@@ -306,16 +305,20 @@ get_history_event (string, caller_index, delimiting_quote) + /* Extract the contents of STRING as if it is enclosed in single quotes. + SINDEX, when passed in, is the offset of the character immediately + following the opening single quote; on exit, SINDEX is left pointing +- to the closing single quote. */ ++ to the closing single quote. FLAGS currently used to allow backslash ++ to escape a single quote (e.g., for bash $'...'). */ + static void +-hist_string_extract_single_quoted (string, sindex) ++hist_string_extract_single_quoted (string, sindex, flags) + char *string; +- int *sindex; ++ int *sindex, flags; + { + register int i; + + for (i = *sindex; string[i] && string[i] != '\''; i++) +- ; ++ { ++ if ((flags & 1) && string[i] == '\\' && string[i+1]) ++ i++; ++ } + + *sindex = i; + } +@@ -505,7 +508,7 @@ postproc_subst_rhs () + } + } + new[j] = '\0'; +- free (subst_rhs); ++ xfree (subst_rhs); + subst_rhs = new; + subst_rhs_len = j; + } +@@ -564,12 +567,12 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + #if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + { +- int c, l; ++ int ch, l; + l = _rl_find_prev_mbchar (string, i, MB_FIND_ANY); +- c = string[l]; ++ ch = string[l]; + /* XXX - original patch had i - 1 ??? If i == 0 it would fail. */ +- if (i && (c == '\'' || c == '"')) +- quoted_search_delimiter = c; ++ if (i && (ch == '\'' || ch == '"')) ++ quoted_search_delimiter = ch; + } + else + #endif /* HANDLE_MULTIBYTE */ +@@ -582,7 +585,7 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + if (event == 0) + { + *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND); +- free (result); ++ xfree (result); + return (-1); + } + +@@ -596,7 +599,7 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + if (word_spec == (char *)&error_pointer) + { + *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC); +- free (result); ++ xfree (result); + return (-1); + } + +@@ -629,8 +632,8 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + { + default: + *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER); +- free (result); +- free (temp); ++ xfree (result); ++ xfree (temp); + return -1; + + case 'q': +@@ -655,7 +658,7 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + { + tstr++; + t = savestring (tstr); +- free (temp); ++ xfree (temp); + temp = t; + } + break; +@@ -680,7 +683,7 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + if (tstr) + { + t = savestring (tstr); +- free (temp); ++ xfree (temp); + temp = t; + } + break; +@@ -756,8 +759,8 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + if (subst_lhs_len == 0) + { + *ret_string = hist_error (string, starting_index, i, NO_PREV_SUBST); +- free (result); +- free (temp); ++ xfree (result); ++ xfree (temp); + return -1; + } + +@@ -766,8 +769,8 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + if (subst_lhs_len > l_temp) + { + *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); +- free (result); +- free (temp); ++ xfree (result); ++ xfree (temp); + return (-1); + } + +@@ -808,7 +811,7 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + temp + si + subst_lhs_len, + l_temp - (si + subst_lhs_len)); + new_event[len] = '\0'; +- free (temp); ++ xfree (temp); + temp = new_event; + + failed = 0; +@@ -844,8 +847,8 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + continue; /* don't want to increment i */ + + *ret_string = hist_error (string, starting_index, i, SUBST_FAILED); +- free (result); +- free (temp); ++ xfree (result); ++ xfree (temp); + return (-1); + } + } +@@ -866,7 +869,7 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + else + x = savestring (temp); + +- free (temp); ++ xfree (temp); + temp = x; + } + +@@ -874,7 +877,7 @@ history_expand_internal (string, start, end_index_ptr, ret_string, current_line) + if (n >= result_len) + result = (char *)xrealloc (result, n + 2); + strcpy (result, temp); +- free (temp); ++ xfree (temp); + + *end_index_ptr = i; + *ret_string = result; +@@ -925,7 +928,7 @@ history_expand (hstring, output) + char **output; + { + register int j; +- int i, r, l, passc, cc, modified, eindex, only_printing, dquote; ++ int i, r, l, passc, cc, modified, eindex, only_printing, dquote, flag; + char *string; + + /* The output string, and its length. */ +@@ -1017,7 +1020,7 @@ history_expand (hstring, output) + } + else if (string[i] == history_expansion_char) + { +- if (!cc || member (cc, history_no_expand_chars)) ++ if (cc == 0 || member (cc, history_no_expand_chars)) + continue; + /* If the calling application has set + history_inhibit_expansion_function to a function that checks +@@ -1045,8 +1048,9 @@ history_expand (hstring, output) + else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'') + { + /* If this is bash, single quotes inhibit history expansion. */ ++ flag = (i > 0 && string[i - 1] == '$'); + i++; +- hist_string_extract_single_quoted (string, &i); ++ hist_string_extract_single_quoted (string, &i, flag); + } + else if (history_quotes_inhibit_expansion && string[i] == '\\') + { +@@ -1060,7 +1064,7 @@ history_expand (hstring, output) + + if (string[i] != history_expansion_char) + { +- free (result); ++ xfree (result); + *output = savestring (string); + return (0); + } +@@ -1097,7 +1101,7 @@ history_expand (hstring, output) + if (strlen (mb) > 1) + { + ADD_STRING (mb); +- break; ++ continue; + } + } + #endif /* HANDLE_MULTIBYTE */ +@@ -1131,15 +1135,16 @@ history_expand (hstring, output) + { + int quote, slen; + ++ flag = (i > 0 && string[i - 1] == '$'); + quote = i++; +- hist_string_extract_single_quoted (string, &i); ++ hist_string_extract_single_quoted (string, &i, flag); + + slen = i - quote + 2; + temp = (char *)xmalloc (slen); + strncpy (temp, string + quote, slen); + temp[slen - 1] = '\0'; + ADD_STRING (temp); +- free (temp); ++ xfree (temp); + } + else + ADD_CHAR (string[i]); +@@ -1152,7 +1157,7 @@ history_expand (hstring, output) + temp = (char *)xmalloc (l - i + 1); + strcpy (temp, string + i); + ADD_STRING (temp); +- free (temp); ++ xfree (temp); + i = l; + } + else +@@ -1165,7 +1170,8 @@ history_expand (hstring, output) + /* If the history_expansion_char is followed by one of the + characters in history_no_expand_chars, then it is not a + candidate for expansion of any kind. */ +- if (member (cc, history_no_expand_chars)) ++ if (cc == 0 || member (cc, history_no_expand_chars) || ++ (history_inhibit_expansion_function && (*history_inhibit_expansion_function) (string, i))) + { + ADD_CHAR (string[i]); + break; +@@ -1184,7 +1190,7 @@ history_expand (hstring, output) + temp = (char *)xmalloc (1 + strlen (result)); + strcpy (temp, result); + ADD_STRING (temp); +- free (temp); ++ xfree (temp); + } + i++; + break; +@@ -1195,9 +1201,9 @@ history_expand (hstring, output) + if (r < 0) + { + *output = temp; +- free (result); ++ xfree (result); + if (string != hstring) +- free (string); ++ xfree (string); + return -1; + } + else +@@ -1207,7 +1213,7 @@ history_expand (hstring, output) + modified++; + if (*temp) + ADD_STRING (temp); +- free (temp); ++ xfree (temp); + } + only_printing = r == 1; + i = eindex; +@@ -1218,7 +1224,7 @@ history_expand (hstring, output) + + *output = result; + if (string != hstring) +- free (string); ++ xfree (string); + + if (only_printing) + { +@@ -1399,8 +1405,8 @@ history_arg_extract (first, last, string) + } + + for (i = 0; i < len; i++) +- free (list[i]); +- free (list); ++ xfree (list[i]); ++ xfree (list); + + return (result); + } +@@ -1411,10 +1417,10 @@ history_tokenize_word (string, ind) + int ind; + { + register int i; +- int delimiter; ++ int delimiter, nestdelim, delimopen; + + i = ind; +- delimiter = 0; ++ delimiter = nestdelim = 0; + + if (member (string[i], "()\n")) + { +@@ -1430,20 +1436,34 @@ history_tokenize_word (string, ind) + { + if (peek == '<' && string[i + 2] == '-') + i++; ++ else if (peek == '<' && string[i + 2] == '<') ++ i++; + i += 2; + return i; + } +- else ++ else if ((peek == '&' && (string[i] == '>' || string[i] == '<')) || ++ (peek == '>' && string[i] == '&')) + { +- if ((peek == '&' && (string[i] == '>' || string[i] == '<')) || +- (peek == '>' && string[i] == '&') || +- (peek == '(' && (string[i] == '>' || string[i] == '<')) || /* ) */ +- (peek == '(' && string[i] == '$')) /* ) */ +- { +- i += 2; +- return i; +- } ++ i += 2; ++ return i; ++ } ++ /* XXX - separated out for later -- bash-4.2 */ ++ else if ((peek == '(' && (string[i] == '>' || string[i] == '<')) || /* ) */ ++ (peek == '(' && string[i] == '$')) /*)*/ ++ { ++ i += 2; ++ delimopen = '('; ++ delimiter = ')'; ++ nestdelim = 1; ++ goto get_word; + } ++#if 0 ++ else if (peek == '\'' && string[i] == '$') ++ { ++ i += 2; /* XXX */ ++ return i; ++ } ++#endif + + if (string[i] != '$') + { +@@ -1452,9 +1472,25 @@ history_tokenize_word (string, ind) + } + } + ++ /* same code also used for $(...)/<(...)/>(...) above */ ++ if (member (string[i], "!@?+*")) ++ { ++ int peek = string[i + 1]; ++ ++ if (peek == '(') /*)*/ ++ { ++ /* Shell extended globbing patterns */ ++ i += 2; ++ delimopen = '('; ++ delimiter = ')'; /* XXX - not perfect */ ++ nestdelim = 1; ++ } ++ } ++ ++get_word: + /* Get word from string + i; */ + +- if (member (string[i], HISTORY_QUOTE_CHARACTERS)) ++ if (delimiter == 0 && member (string[i], HISTORY_QUOTE_CHARACTERS)) + delimiter = string[i++]; + + for (; string[i]; i++) +@@ -1472,16 +1508,31 @@ history_tokenize_word (string, ind) + continue; + } + ++ /* delimiter must be set and set to something other than a quote if ++ nestdelim is set, so these tests are safe. */ ++ if (nestdelim && string[i] == delimopen) ++ { ++ nestdelim++; ++ continue; ++ } ++ if (nestdelim && string[i] == delimiter) ++ { ++ nestdelim--; ++ if (nestdelim == 0) ++ delimiter = 0; ++ continue; ++ } ++ + if (delimiter && string[i] == delimiter) + { + delimiter = 0; + continue; + } + +- if (!delimiter && (member (string[i], history_word_delimiters))) ++ if (delimiter == 0 && (member (string[i], history_word_delimiters))) + break; + +- if (!delimiter && member (string[i], HISTORY_QUOTE_CHARACTERS)) ++ if (delimiter == 0 && member (string[i], HISTORY_QUOTE_CHARACTERS)) + delimiter = string[i]; + } + +@@ -1569,6 +1620,18 @@ history_tokenize (string) + return (history_tokenize_internal (string, -1, (int *)NULL)); + } + ++/* Free members of WORDS from START to an empty string */ ++static void ++freewords (words, start) ++ char **words; ++ int start; ++{ ++ register int i; ++ ++ for (i = start; words[i]; i++) ++ xfree (words[i]); ++} ++ + /* Find and return the word which contains the character at index IND + in the history line LINE. Used to save the word matched by the + last history !?string? search. */ +@@ -1582,12 +1645,16 @@ history_find_word (line, ind) + + words = history_tokenize_internal (line, ind, &wind); + if (wind == -1 || words == 0) +- return ((char *)NULL); ++ { ++ if (words) ++ freewords (words, 0); ++ FREE (words); ++ return ((char *)NULL); ++ } + s = words[wind]; + for (i = 0; i < wind; i++) +- free (words[i]); +- for (i = wind + 1; words[i]; i++) +- free (words[i]); +- free (words); ++ xfree (words[i]); ++ freewords (words, wind + 1); ++ xfree (words); + return s; + } +--- a/readline/histfile.c ++++ b/readline/histfile.c +@@ -1,24 +1,23 @@ + /* histfile.c - functions to manipulate the history file. */ + +-/* Copyright (C) 1989-2003 Free Software Foundation, Inc. ++/* Copyright (C) 1989-2010 Free Software Foundation, Inc. + +- This file contains the GNU History Library (the Library), a set of ++ This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + +- The Library is free software; you can redistribute it and/or modify ++ History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ History is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with History. If not, see . ++*/ + + /* The goal is to make the implementation transparent, so that you + don't have to know what data types are used, just what functions +@@ -53,7 +52,9 @@ + # include + #endif + +-#if defined (__EMX__) || defined (__CYGWIN__) ++#include ++ ++#if defined (__EMX__) + # undef HAVE_MMAP + #endif + +@@ -103,7 +104,7 @@ int history_write_timestamps = 0; + + /* Does S look like the beginning of a history timestamp entry? Placeholder + for more extensive tests. */ +-#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char) ++#define HIST_TIMESTAMP_START(s) (*(s) == history_comment_char && isdigit ((s)[1]) ) + + /* Return the string that should be used in the place of this + filename. This only matters when you don't specify the +@@ -125,8 +126,12 @@ history_filename (filename) + + if (home == 0) + { ++#if 0 + home = "."; + home_len = 1; ++#else ++ return (NULL); ++#endif + } + else + home_len = strlen (home); +@@ -178,7 +183,7 @@ read_history_range (filename, from, to) + + buffer = last_ts = (char *)NULL; + input = history_filename (filename); +- file = open (input, O_RDONLY|O_BINARY, 0666); ++ file = input ? open (input, O_RDONLY|O_BINARY, 0666) : -1; + + if ((file < 0) || (fstat (file, &finfo) == -1)) + goto error_and_exit; +@@ -256,8 +261,9 @@ read_history_range (filename, from, to) + for (line_end = line_start; line_end < bufend; line_end++) + if (*line_end == '\n') + { +- if (line_end - 1 >= line_start && *(line_end - 1) == '\r') +- *(line_end - 1) = '\0'; ++ /* Change to allow Windows-like \r\n end of line delimiter. */ ++ if (line_end > line_start && line_end[-1] == '\r') ++ line_end[-1] = '\0'; + else + *line_end = '\0'; + +@@ -312,7 +318,7 @@ history_truncate_file (fname, lines) + + buffer = (char *)NULL; + filename = history_filename (fname); +- file = open (filename, O_RDONLY|O_BINARY, 0666); ++ file = filename ? open (filename, O_RDONLY|O_BINARY, 0666) : -1; + rv = 0; + + /* Don't try to truncate non-regular files. */ +@@ -411,7 +417,7 @@ history_truncate_file (fname, lines) + + FREE (buffer); + +- free (filename); ++ xfree (filename); + return rv; + } + +@@ -434,9 +440,10 @@ history_do_write (filename, nelements, overwrite) + mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY; + #endif + output = history_filename (filename); ++ file = output ? open (output, mode, 0600) : -1; + rv = 0; + +- if ((file = open (output, mode, 0600)) == -1) ++ if (file == -1) + { + FREE (output); + return (errno); +@@ -513,7 +520,7 @@ mmap_error: + #else + if (write (file, buffer, buffer_size) < 0) + rv = errno; +- free (buffer); ++ xfree (buffer); + #endif + } + +--- a/readline/histlib.h ++++ b/readline/histlib.h +@@ -1,23 +1,23 @@ + /* histlib.h -- internal definitions for the history library. */ +-/* Copyright (C) 1989, 1992 Free Software Foundation, Inc. + +- This file contains the GNU History Library (the Library), a set of ++/* Copyright (C) 1989-2009 Free Software Foundation, Inc. ++ ++ This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + +- The Library is free software; you can redistribute it and/or modify ++ History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ History is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with History. If not, see . ++*/ + + #if !defined (_HISTLIB_H_) + #define _HISTLIB_H_ +--- a/readline/history.c ++++ b/readline/history.c +@@ -1,24 +1,23 @@ + /* history.c -- standalone history library */ + +-/* Copyright (C) 1989-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1989-2009 Free Software Foundation, Inc. + +- This file contains the GNU History Library (the Library), a set of ++ This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + +- The Library is free software; you can redistribute it and/or modify ++ History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ History is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with History. If not, see . ++*/ + + /* The goal is to make the implementation transparent, so that you + don't have to know what data types are used, just what functions +@@ -158,7 +157,7 @@ history_set_pos (pos) + return (1); + } + +-/* Return the current history array. The caller has to be carefull, since this ++/* Return the current history array. The caller has to be careful, since this + is the actual array of data, and could be bashed or made corrupt easily. + The array is terminated with a NULL pointer. */ + HIST_ENTRY ** +@@ -209,6 +208,22 @@ history_get (offset) + : the_history[local_index]; + } + ++HIST_ENTRY * ++alloc_history_entry (string, ts) ++ char *string; ++ char *ts; ++{ ++ HIST_ENTRY *temp; ++ ++ temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); ++ ++ temp->line = string ? savestring (string) : string; ++ temp->data = (char *)NULL; ++ temp->timestamp = ts; ++ ++ return temp; ++} ++ + time_t + history_get_time (hist) + HIST_ENTRY *hist; +@@ -290,11 +305,7 @@ add_history (string) + } + } + +- temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY)); +- temp->line = savestring (string); +- temp->data = (char *)NULL; +- +- temp->timestamp = hist_inittime (); ++ temp = alloc_history_entry (string, hist_inittime ()); + + the_history[history_length] = (HIST_ENTRY *)NULL; + the_history[history_length - 1] = temp; +@@ -307,6 +318,8 @@ add_history_time (string) + { + HIST_ENTRY *hs; + ++ if (string == 0) ++ return; + hs = the_history[history_length - 1]; + FREE (hs->timestamp); + hs->timestamp = savestring (string); +@@ -325,9 +338,29 @@ free_history_entry (hist) + FREE (hist->line); + FREE (hist->timestamp); + x = hist->data; +- free (hist); ++ xfree (hist); + return (x); + } ++ ++HIST_ENTRY * ++copy_history_entry (hist) ++ HIST_ENTRY *hist; ++{ ++ HIST_ENTRY *ret; ++ char *ts; ++ ++ if (hist == 0) ++ return hist; ++ ++ ret = alloc_history_entry (hist->line, (char *)NULL); ++ ++ ts = hist->timestamp ? savestring (hist->timestamp) : hist->timestamp; ++ ret->timestamp = ts; ++ ++ ret->data = hist->data; ++ ++ return ret; ++} + + /* Make the history entry at WHICH have LINE and DATA. This returns + the old entry so you can dispose of the data. In the case of an +@@ -354,6 +387,51 @@ replace_history_entry (which, line, data) + return (old_value); + } + ++/* Replace the DATA in the specified history entries, replacing OLD with ++ NEW. WHICH says which one(s) to replace: WHICH == -1 means to replace ++ all of the history entries where entry->data == OLD; WHICH == -2 means ++ to replace the `newest' history entry where entry->data == OLD; and ++ WHICH >= 0 means to replace that particular history entry's data, as ++ long as it matches OLD. */ ++void ++replace_history_data (which,old, new) ++ int which; ++ histdata_t *old, *new; ++{ ++ HIST_ENTRY *entry; ++ register int i, last; ++ ++ if (which < -2 || which >= history_length || history_length == 0 || the_history == 0) ++ return; ++ ++ if (which >= 0) ++ { ++ entry = the_history[which]; ++ if (entry && entry->data == old) ++ entry->data = new; ++ return; ++ } ++ ++ last = -1; ++ for (i = 0; i < history_length; i++) ++ { ++ entry = the_history[i]; ++ if (entry == 0) ++ continue; ++ if (entry->data == old) ++ { ++ last = i; ++ if (which == -1) ++ entry->data = new; ++ } ++ } ++ if (which == -2 && last >= 0) ++ { ++ entry = the_history[last]; ++ entry->data = new; /* XXX - we don't check entry->old */ ++ } ++} ++ + /* Remove history element WHICH from the history. The removed + element is returned to you so you can free the line, data, + and containing structure. */ +@@ -406,7 +484,7 @@ stifle_history (max) + + /* Stop stifling the history. This returns the previous maximum + number of history entries. The value is positive if the history +- was stifled, negative if it wasn't. */ ++ was stifled, negative if it wasn't. */ + int + unstifle_history () + { +--- a/readline/history.h ++++ b/readline/history.h +@@ -1,23 +1,23 @@ + /* history.h -- the names of functions that you can call in history. */ +-/* Copyright (C) 1989-2003 Free Software Foundation, Inc. + +- This file contains the GNU History Library (the Library), a set of ++/* Copyright (C) 1989-2009 Free Software Foundation, Inc. ++ ++ This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + +- The Library is free software; you can redistribute it and/or modify ++ History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ History is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with History. If not, see . ++*/ + + #ifndef _HISTORY_H_ + #define _HISTORY_H_ +--- a/readline/histsearch.c ++++ b/readline/histsearch.c +@@ -1,24 +1,23 @@ + /* histsearch.c -- searching the history list. */ + +-/* Copyright (C) 1989, 1992 Free Software Foundation, Inc. ++/* Copyright (C) 1989, 1992-2009 Free Software Foundation, Inc. + +- This file contains the GNU History Library (the Library), a set of ++ This file contains the GNU History Library (History), a set of + routines for managing the text of previously typed lines. + +- The Library is free software; you can redistribute it and/or modify ++ History is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ History is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with History. If not, see . ++*/ + + #define READLINE_LIBRARY + +--- a/readline/input.c ++++ b/readline/input.c +@@ -1,24 +1,24 @@ + /* input.c -- character input functions for readline. */ + +-/* Copyright (C) 1994-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1994-2010 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (__TANDEM) +@@ -45,14 +45,7 @@ + # include "ansi_stdlib.h" + #endif /* HAVE_STDLIB_H */ + +-#if defined (HAVE_SELECT) +-# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX) +-# include +-# endif +-#endif /* HAVE_SELECT */ +-#if defined (HAVE_SYS_SELECT_H) +-# include +-#endif ++#include "posixselect.h" + + #if defined (FIONREAD_IN_SYS_IOCTL) + # include +@@ -133,8 +126,11 @@ rl_get_char (key) + return (0); + + *key = ibuffer[pop_index++]; +- ++#if 0 + if (pop_index >= ibuffer_len) ++#else ++ if (pop_index > ibuffer_len) ++#endif + pop_index = 0; + + return (1); +@@ -151,7 +147,7 @@ _rl_unget_char (key) + { + pop_index--; + if (pop_index < 0) +- pop_index = ibuffer_len - 1; ++ pop_index = ibuffer_len; + ibuffer[pop_index] = key; + return (1); + } +@@ -179,6 +175,7 @@ rl_gather_tyi () + struct timeval timeout; + #endif + ++ chars_avail = 0; + tty = fileno (rl_instream); + + #if defined (HAVE_SELECT) +@@ -186,8 +183,7 @@ rl_gather_tyi () + FD_ZERO (&exceptfds); + FD_SET (tty, &readfds); + FD_SET (tty, &exceptfds); +- timeout.tv_sec = 0; +- timeout.tv_usec = _keyboard_input_timeout; ++ USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout); + result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); + if (result <= 0) + return 0; /* Nothing to read. */ +@@ -221,13 +217,10 @@ rl_gather_tyi () + #endif /* O_NDELAY */ + + #if defined (__MINGW32__) +- /* We use getch to read console input, so use the same +- mechanism to check for more. Otherwise, we don't know. */ +- if (isatty (fileno (rl_instream))) +- chars_avail = _kbhit (); +- else +- chars_avail = 0; +- result = 0; ++ /* Use getch/_kbhit to check for available console input, in the same way ++ that we read it normally. */ ++ chars_avail = isatty (tty) ? _kbhit () : 0; ++ result = 0; + #endif + + /* If there's nothing available, don't waste time trying to read +@@ -251,8 +244,10 @@ rl_gather_tyi () + { + while (chars_avail--) + { ++ RL_CHECK_SIGNALS (); + k = (*rl_getc_function) (rl_instream); +- rl_stuff_char (k); ++ if (rl_stuff_char (k) == 0) ++ break; /* some problem; no more room */ + if (k == NEWLINE || k == RETURN) + break; + } +@@ -273,7 +268,7 @@ rl_set_keyboard_input_timeout (u) + int o; + + o = _keyboard_input_timeout; +- if (u > 0) ++ if (u >= 0) + _keyboard_input_timeout = u; + return (o); + } +@@ -316,10 +311,8 @@ _rl_input_available () + #endif + + #if defined (__MINGW32__) +- /* We use getch to read console input, so use the same +- mechanism to check for more. Otherwise, we don't know. */ +- if (isatty (fileno (rl_instream))) +- return _kbhit (); ++ if (isatty (tty)) ++ return (_kbhit ()); + #endif + + return 0; +@@ -358,7 +351,7 @@ _rl_insert_typein (c) + + string[i] = '\0'; + rl_insert_text (string); +- free (string); ++ xfree (string); + } + + /* Add KEY to the buffer of characters to be read. Returns 1 if the +@@ -377,7 +370,11 @@ rl_stuff_char (key) + RL_SETSTATE (RL_STATE_INPUTPENDING); + } + ibuffer[push_index++] = key; ++#if 0 + if (push_index >= ibuffer_len) ++#else ++ if (push_index > ibuffer_len) ++#endif + push_index = 0; + + return 1; +@@ -430,22 +427,26 @@ rl_read_key () + /* If the user has an event function, then call it periodically. */ + if (rl_event_hook) + { +- while (rl_event_hook && rl_get_char (&c) == 0) ++ while (rl_event_hook) + { +- (*rl_event_hook) (); +- if (rl_done) /* XXX - experimental */ +- return ('\n'); + if (rl_gather_tyi () < 0) /* XXX - EIO */ + { + rl_done = 1; + return ('\n'); + } ++ RL_CHECK_SIGNALS (); ++ if (rl_get_char (&c) != 0) ++ break; ++ if (rl_done) /* XXX - experimental */ ++ return ('\n'); ++ (*rl_event_hook) (); + } + } + else + { + if (rl_get_char (&c) == 0) + c = (*rl_getc_function) (rl_instream); ++ RL_CHECK_SIGNALS (); + } + } + +@@ -461,6 +462,8 @@ rl_getc (stream) + + while (1) + { ++ RL_CHECK_SIGNALS (); ++ + #if defined (__MINGW32__) + if (isatty (fileno (stream))) + return (getch ()); +@@ -506,7 +509,7 @@ rl_getc (stream) + this is simply an interrupted system call to read (). + Otherwise, some error ocurred, also signifying EOF. */ + if (errno != EINTR) +- return (EOF); ++ return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF); + } + } + +@@ -517,20 +520,26 @@ _rl_read_mbchar (mbchar, size) + char *mbchar; + int size; + { +- int mb_len = 0; ++ int mb_len, c; + size_t mbchar_bytes_length; + wchar_t wc; + mbstate_t ps, ps_back; + + memset(&ps, 0, sizeof (mbstate_t)); + memset(&ps_back, 0, sizeof (mbstate_t)); +- ++ ++ mb_len = 0; + while (mb_len < size) + { + RL_SETSTATE(RL_STATE_MOREINPUT); +- mbchar[mb_len++] = rl_read_key (); ++ c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ break; ++ ++ mbchar[mb_len++] = c; ++ + mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); + if (mbchar_bytes_length == (size_t)(-1)) + break; /* invalid byte sequence for the current locale */ +@@ -554,21 +563,21 @@ _rl_read_mbchar (mbchar, size) + } + + /* Read a multibyte-character string whose first character is FIRST into +- the buffer MB of length MBLEN. Returns the last character read, which ++ the buffer MB of length MLEN. Returns the last character read, which + may be FIRST. Used by the search functions, among others. Very similar + to _rl_read_mbchar. */ + int +-_rl_read_mbstring (first, mb, mblen) ++_rl_read_mbstring (first, mb, mlen) + int first; + char *mb; +- int mblen; ++ int mlen; + { + int i, c; + mbstate_t ps; + + c = first; +- memset (mb, 0, mblen); +- for (i = 0; i < mblen; i++) ++ memset (mb, 0, mlen); ++ for (i = 0; c >= 0 && i < mlen; i++) + { + mb[i] = (char)c; + memset (&ps, 0, sizeof (mbstate_t)); +--- a/readline/isearch.c ++++ b/readline/isearch.c +@@ -1,29 +1,30 @@ ++/* isearch.c - incremental searching */ ++ + /* **************************************************************** */ + /* */ + /* I-Search and Searching */ + /* */ + /* **************************************************************** */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file contains the Readline Library (the Library), a set of +- routines for providing Emacs style line input to programs that ask +- for it. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -68,14 +69,14 @@ static void _rl_isearch_fini PARAMS((_rl_search_cxt *)); + static int _rl_isearch_cleanup PARAMS((_rl_search_cxt *, int)); + + /* Last line found by the current incremental search, so we don't `find' +- identical lines many times in a row. */ +-static char *prev_line_found; ++ identical lines many times in a row. Now part of isearch context. */ ++/* static char *prev_line_found; */ + + /* Last search string and its length. */ + static char *last_isearch_string; + static int last_isearch_string_len; + +-static char *default_isearch_terminators = "\033\012"; ++static char * const default_isearch_terminators = "\033\012"; + + _rl_search_cxt * + _rl_scxt_alloc (type, flags) +@@ -103,6 +104,9 @@ _rl_scxt_alloc (type, flags) + + cxt->save_undo_list = 0; + ++ cxt->keymap = _rl_keymap; ++ cxt->okeymap = _rl_keymap; ++ + cxt->history_pos = 0; + cxt->direction = 0; + +@@ -125,7 +129,7 @@ _rl_scxt_dispose (cxt, flags) + FREE (cxt->allocated_line); + FREE (cxt->lines); + +- free (cxt); ++ xfree (cxt); + } + + /* Search backwards through the history looking for a string which is typed +@@ -192,7 +196,7 @@ rl_display_search (search_string, reverse_p, where) + strcpy (message + msglen, "': "); + + rl_message ("%s", message); +- free (message); ++ xfree (message); + (*rl_redisplay_function) (); + } + +@@ -327,11 +331,30 @@ _rl_isearch_dispatch (cxt, c) + rl_command_func_t *f; + + f = (rl_command_func_t *)NULL; +- +- /* Translate the keys we do something with to opcodes. */ +- if (c >= 0 && _rl_keymap[c].type == ISFUNC) ++ ++ if (c < 0) ++ { ++ cxt->sflags |= SF_FAILED; ++ cxt->history_pos = cxt->last_found_line; ++ return -1; ++ } ++ ++ /* If we are moving into a new keymap, modify cxt->keymap and go on. ++ This can be a problem if c == ESC and we want to terminate the ++ incremental search, so we check */ ++ if (c >= 0 && cxt->keymap[c].type == ISKMAP && strchr (cxt->search_terminators, cxt->lastc) == 0) + { +- f = _rl_keymap[c].function; ++ cxt->keymap = FUNCTION_TO_KEYMAP (cxt->keymap, c); ++ cxt->sflags |= SF_CHGKMAP; ++ /* XXX - we should probably save this sequence, so we can do ++ something useful if this doesn't end up mapping to a command. */ ++ return 1; ++ } ++ ++ /* Translate the keys we do something with to opcodes. */ ++ if (c >= 0 && cxt->keymap[c].type == ISFUNC) ++ { ++ f = cxt->keymap[c].function; + + if (f == rl_reverse_search_history) + cxt->lastc = (cxt->sflags & SF_REVERSE) ? -1 : -2; +@@ -339,19 +362,27 @@ _rl_isearch_dispatch (cxt, c) + cxt->lastc = (cxt->sflags & SF_REVERSE) ? -2 : -1; + else if (f == rl_rubout) + cxt->lastc = -3; +- else if (c == CTRL ('G')) ++ else if (c == CTRL ('G') || f == rl_abort) + cxt->lastc = -4; +- else if (c == CTRL ('W')) /* XXX */ ++ else if (c == CTRL ('W') || f == rl_unix_word_rubout) /* XXX */ + cxt->lastc = -5; +- else if (c == CTRL ('Y')) /* XXX */ ++ else if (c == CTRL ('Y') || f == rl_yank) /* XXX */ + cxt->lastc = -6; + } + ++ /* If we changed the keymap earlier while translating a key sequence into ++ a command, restore it now that we've succeeded. */ ++ if (cxt->sflags & SF_CHGKMAP) ++ { ++ cxt->keymap = cxt->okeymap; ++ cxt->sflags &= ~SF_CHGKMAP; ++ } ++ + /* The characters in isearch_terminators (set from the user-settable + variable isearch-terminators) are used to terminate the search but + not subsequently execute the character as a command. The default + value is "\033\012" (ESC and C-J). */ +- if (strchr (cxt->search_terminators, cxt->lastc)) ++ if (cxt->lastc > 0 && strchr (cxt->search_terminators, cxt->lastc)) + { + /* ESC still terminates the search, but if there is pending + input or if input arrives within 0.1 seconds (on systems +@@ -375,7 +406,7 @@ _rl_isearch_dispatch (cxt, c) + { + if (cxt->lastc >= 0 && (cxt->mb[0] && cxt->mb[1] == '\0') && ENDSRCH_CHAR (cxt->lastc)) + { +- /* This sets rl_pending_input to c; it will be picked up the next ++ /* This sets rl_pending_input to LASTC; it will be picked up the next + time rl_read_key is called. */ + rl_execute_next (cxt->lastc); + return (0); +--- a/readline/keymaps.c ++++ b/readline/keymaps.c +@@ -1,23 +1,24 @@ + /* keymaps.c -- Functions and keymaps for the GNU Readline library. */ + +-/* Copyright (C) 1988,1989 Free Software Foundation, Inc. ++/* Copyright (C) 1988,1989-2009 Free Software Foundation, Inc. + +- This file is part of GNU Readline, a library for reading lines +- of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- Readline is free software; you can redistribute it and/or modify it +- under the terms of the GNU General Public License as published by the +- Free Software Foundation; either version 2, or (at your option) any +- later version. ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- Readline is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with Readline; see the file COPYING. If not, write to the Free +- Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -56,8 +57,9 @@ Keymap + rl_make_bare_keymap () + { + register int i; +- Keymap keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); ++ Keymap keymap; + ++ keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); + for (i = 0; i < KEYMAP_SIZE; i++) + { + keymap[i].type = ISFUNC; +@@ -75,7 +77,8 @@ rl_make_bare_keymap () + return (keymap); + } + +-/* Return a new keymap which is a copy of MAP. */ ++/* Return a new keymap which is a copy of MAP. Just copies pointers, does ++ not copy text of macros or descend into child keymaps. */ + Keymap + rl_copy_keymap (map) + Keymap map; +@@ -127,7 +130,7 @@ rl_discard_keymap (map) + { + int i; + +- if (!map) ++ if (map == 0) + return; + + for (i = 0; i < KEYMAP_SIZE; i++) +@@ -139,11 +142,21 @@ rl_discard_keymap (map) + + case ISKMAP: + rl_discard_keymap ((Keymap)map[i].function); ++ xfree ((char *)map[i].function); + break; + + case ISMACR: +- free ((char *)map[i].function); ++ xfree ((char *)map[i].function); + break; + } + } + } ++ ++/* Convenience function that discards, then frees, MAP. */ ++void ++rl_free_keymap (map) ++ Keymap map; ++{ ++ rl_discard_keymap (map); ++ xfree ((char *)map); ++} +--- a/readline/keymaps.h ++++ b/readline/keymaps.h +@@ -2,23 +2,22 @@ + + /* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #ifndef _KEYMAPS_H_ + #define _KEYMAPS_H_ +@@ -53,11 +52,6 @@ typedef struct _keymap_entry { + #define KEYMAP_SIZE 257 + #define ANYOTHERKEY KEYMAP_SIZE-1 + +-/* I wanted to make the above structure contain a union of: +- union { rl_command_func_t *function; struct _keymap_entry *keymap; } value; +- but this made it impossible for me to create a static array. +- Maybe I need C lessons. */ +- + typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE]; + typedef KEYMAP_ENTRY *Keymap; + +--- a/readline/kill.c ++++ b/readline/kill.c +@@ -2,23 +2,23 @@ + + /* Copyright (C) 1994 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -115,7 +115,7 @@ _rl_copy_to_kill_ring (text, append) + if (slot == rl_max_kills) + { + register int i; +- free (rl_kill_ring[0]); ++ xfree (rl_kill_ring[0]); + for (i = 0; i < slot; i++) + rl_kill_ring[i] = rl_kill_ring[i + 1]; + } +@@ -146,8 +146,8 @@ _rl_copy_to_kill_ring (text, append) + strcpy (new, text); + strcat (new, old); + } +- free (old); +- free (text); ++ xfree (old); ++ xfree (text); + rl_kill_ring[slot] = new; + } + else +@@ -582,6 +582,7 @@ rl_yank_nth_arg_internal (count, ignore, history_skip) + if (!arg || !*arg) + { + rl_ding (); ++ FREE (arg); + return -1; + } + +@@ -600,7 +601,7 @@ rl_yank_nth_arg_internal (count, ignore, history_skip) + #endif /* VI_MODE */ + + rl_insert_text (arg); +- free (arg); ++ xfree (arg); + + rl_end_undo_group (); + return 0; +@@ -639,7 +640,7 @@ rl_yank_last_arg (count, key) + { + if (undo_needed) + rl_do_undo (); +- if (count < 1) ++ if (count < 0) /* XXX - was < 1 */ + direction = -direction; + history_skip += direction; + if (history_skip < 0) +@@ -685,7 +686,7 @@ rl_paste_from_clipboard (count, key) + _rl_set_mark_at_pos (rl_point); + rl_insert_text (ptr); + if (ptr != data) +- free (ptr); ++ xfree (ptr); + CloseClipboard (); + } + return (0); +--- a/readline/macro.c ++++ b/readline/macro.c +@@ -1,24 +1,24 @@ + /* macro.c -- keyboard macros for readline. */ + +-/* Copyright (C) 1994 Free Software Foundation, Inc. ++/* Copyright (C) 1994-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -113,7 +113,7 @@ _rl_next_macro_key () + + #if defined (READLINE_CALLBACKS) + c = rl_executing_macro[executing_macro_index++]; +- if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD) && rl_executing_macro[executing_macro_index] == 0) ++ if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0) + _rl_pop_executing_macro (); + return c; + #else +@@ -152,7 +152,7 @@ _rl_pop_executing_macro () + rl_executing_macro = macro_list->string; + executing_macro_index = macro_list->sindex; + macro_list = macro_list->next; +- free (macro); ++ xfree (macro); + } + + if (rl_executing_macro == 0) +@@ -181,7 +181,7 @@ _rl_kill_kbd_macro () + { + if (current_macro) + { +- free (current_macro); ++ xfree (current_macro); + current_macro = (char *) NULL; + } + current_macro_size = current_macro_index = 0; +--- a/readline/mbutil.c ++++ b/readline/mbutil.c +@@ -1,24 +1,24 @@ + /* mbutil.c -- readline multibyte character utility functions */ + +-/* Copyright (C) 2001-2005 Free Software Foundation, Inc. ++/* Copyright (C) 2001-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -77,7 +77,7 @@ _rl_find_next_mbchar_internal (string, seed, count, find_non_zero) + char *string; + int seed, count, find_non_zero; + { +- size_t tmp; ++ size_t tmp, len; + mbstate_t ps; + int point; + wchar_t wc; +@@ -91,17 +91,21 @@ _rl_find_next_mbchar_internal (string, seed, count, find_non_zero) + return seed; + + point = seed + _rl_adjust_point (string, seed, &ps); +- /* if this is true, means that seed was not pointed character +- started byte. So correct the point and consume count */ ++ /* if this is true, means that seed was not pointing to a byte indicating ++ the beginning of a multibyte character. Correct the point and consume ++ one char. */ + if (seed < point) + count--; + + while (count > 0) + { +- tmp = mbrtowc (&wc, string+point, strlen(string + point), &ps); ++ len = strlen (string + point); ++ if (len == 0) ++ break; ++ tmp = mbrtowc (&wc, string+point, len, &ps); + if (MB_INVALIDCH ((size_t)tmp)) + { +- /* invalid bytes. asume a byte represents a character */ ++ /* invalid bytes. assume a byte represents a character */ + point++; + count--; + /* reset states. */ +@@ -128,12 +132,10 @@ _rl_find_next_mbchar_internal (string, seed, count, find_non_zero) + if (find_non_zero) + { + tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps); +- while (tmp > 0 && wcwidth (wc) == 0) ++ while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && wcwidth (wc) == 0) + { + point += tmp; + tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps); +- if (MB_NULLWCH (tmp) || MB_INVALIDCH (tmp)) +- break; + } + } + +--- a/readline/misc.c ++++ b/readline/misc.c +@@ -1,24 +1,24 @@ + /* misc.c -- miscellaneous bindable readline functions. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -146,6 +146,8 @@ _rl_arg_dispatch (cxt, c) + rl_restore_prompt (); + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); ++ if (key < 0) ++ return -1; + return (_rl_dispatch (key, _rl_keymap)); + } + } +@@ -212,6 +214,8 @@ rl_digit_loop () + if (r <= 0 || (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)) + break; + } ++ ++ return r; + } + + /* Create a default argument. */ +@@ -324,7 +328,7 @@ _rl_free_history_entry (entry) + FREE (entry->line); + FREE (entry->timestamp); + +- free (entry); ++ xfree (entry); + } + + /* Perhaps put back the current line if it has changed. */ +@@ -338,9 +342,9 @@ rl_maybe_replace_line () + if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list)) + { + temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list); +- free (temp->line); ++ xfree (temp->line); + FREE (temp->timestamp); +- free (temp); ++ xfree (temp); + } + return 0; + } +@@ -427,6 +431,56 @@ rl_replace_from_history (entry, flags) + rl_mark = rl_end; + } + #endif ++} ++ ++/* Process and free undo lists attached to each history entry prior to the ++ current entry, inclusive, reverting each line to its saved state. This ++ is destructive, and state about the current line is lost. This is not ++ intended to be called while actively editing, and the current line is ++ not assumed to have been added to the history list. */ ++void ++_rl_revert_all_lines () ++{ ++ int hpos; ++ HIST_ENTRY *entry; ++ UNDO_LIST *ul, *saved_undo_list; ++ char *lbuf; ++ ++ lbuf = savestring (rl_line_buffer); ++ saved_undo_list = rl_undo_list; ++ hpos = where_history (); ++ ++ entry = (hpos == history_length) ? previous_history () : current_history (); ++ while (entry) ++ { ++ if (ul = (UNDO_LIST *)entry->data) ++ { ++ if (ul == saved_undo_list) ++ saved_undo_list = 0; ++ /* Set up rl_line_buffer and other variables from history entry */ ++ rl_replace_from_history (entry, 0); /* entry->line is now current */ ++ /* Undo all changes to this history entry */ ++ while (rl_undo_list) ++ rl_do_undo (); ++ /* And copy the reverted line back to the history entry, preserving ++ the timestamp. */ ++ FREE (entry->line); ++ entry->line = savestring (rl_line_buffer); ++ entry->data = 0; ++ } ++ entry = previous_history (); ++ } ++ ++ /* Restore history state */ ++ rl_undo_list = saved_undo_list; /* may have been set to null */ ++ history_set_pos (hpos); ++ ++ /* reset the line buffer */ ++ rl_replace_line (lbuf, 0); ++ _rl_set_the_line (); ++ ++ /* and clean up */ ++ xfree (lbuf); + } + + /* **************************************************************** */ +@@ -556,7 +610,7 @@ rl_vi_editing_mode (count, key) + #if defined (VI_MODE) + _rl_set_insert_mode (RL_IM_INSERT, 1); /* vi mode ignores insert mode */ + rl_editing_mode = vi_mode; +- rl_vi_insertion_mode (1, key); ++ rl_vi_insert_mode (1, key); + #endif /* VI_MODE */ + + return 0; +--- a/readline/nls.c ++++ b/readline/nls.c +@@ -1,24 +1,24 @@ + /* nls.c -- skeletal internationalization code. */ + +-/* Copyright (C) 1996 Free Software Foundation, Inc. ++/* Copyright (C) 1996-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -145,7 +145,7 @@ _rl_init_eightbit () + _rl_output_meta_chars = 1; + break; + } +- free (t); ++ xfree (t); + return (legal_lang_values[i] ? 1 : 0); + + #endif /* !HAVE_SETLOCALE */ +--- a/readline/parens.c ++++ b/readline/parens.c +@@ -1,24 +1,24 @@ +-/* parens.c -- Implementation of matching parentheses feature. */ ++/* parens.c -- implementation of matching parentheses feature. */ + +-/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. ++/* Copyright (C) 1987, 1989, 1992-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (__TANDEM) +@@ -38,16 +38,7 @@ + # include + #endif + +-#if defined (FD_SET) && !defined (HAVE_SELECT) +-# define HAVE_SELECT +-#endif +- +-#if defined (HAVE_SELECT) +-# include +-#endif /* HAVE_SELECT */ +-#if defined (HAVE_SYS_SELECT_H) +-# include +-#endif ++#include "posixselect.h" + + #if defined (HAVE_STRING_H) + # include +@@ -130,8 +121,7 @@ rl_insert_close (count, invoking_key) + + FD_ZERO (&readfds); + FD_SET (fileno (rl_instream), &readfds); +- timer.tv_sec = 0; +- timer.tv_usec = _paren_blink_usec; ++ USEC_TO_TIMEVAL (_paren_blink_usec, timer); + + orig_point = rl_point; + rl_point = match_point; +--- /dev/null ++++ b/readline/patchlevel +@@ -0,0 +1,3 @@ ++# Do not edit -- exists only for use by patch ++ ++1 +--- a/readline/posixdir.h ++++ b/readline/posixdir.h +@@ -4,19 +4,19 @@ + + This file is part of GNU Bash, the Bourne Again SHell. + +- Bash is free software; you can redistribute it and/or modify it +- under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ Bash is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- Bash is distributed in the hope that it will be useful, but WITHOUT +- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +- License for more details. ++ Bash is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with Bash; see the file COPYING. If not, write to the Free +- Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ along with Bash. If not, see . ++*/ + + /* This file should be included instead of or . */ + +--- a/readline/posixjmp.h ++++ b/readline/posixjmp.h +@@ -4,19 +4,19 @@ + + This file is part of GNU Bash, the Bourne Again SHell. + +- Bash is free software; you can redistribute it and/or modify it +- under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ Bash is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- Bash is distributed in the hope that it will be useful, but WITHOUT +- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +- License for more details. ++ Bash is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with Bash; see the file COPYING. If not, write to the Free +- Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ along with Bash. If not, see . ++*/ + + #ifndef _POSIXJMP_H_ + #define _POSIXJMP_H_ +--- /dev/null ++++ b/readline/posixselect.h +@@ -0,0 +1,47 @@ ++/* posixselect.h -- wrapper for select(2) includes and definitions */ ++ ++/* Copyright (C) 2009 Free Software Foundation, Inc. ++ ++ This file is part of GNU Bash, the Bourne Again SHell. ++ ++ Bash is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Bash is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Bash. If not, see . ++*/ ++ ++#ifndef _POSIXSELECT_H_ ++#define _POSIXSELECT_H_ ++ ++#if defined (FD_SET) && !defined (HAVE_SELECT) ++# define HAVE_SELECT 1 ++#endif ++ ++#if defined (HAVE_SELECT) ++# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX) ++# include ++# endif ++#endif /* HAVE_SELECT */ ++#if defined (HAVE_SYS_SELECT_H) ++# include ++#endif ++ ++#ifndef USEC_PER_SEC ++# define USEC_PER_SEC 1000000 ++#endif ++ ++#define USEC_TO_TIMEVAL(us, tv) \ ++do { \ ++ (tv).tv_sec = (us) / USEC_PER_SEC; \ ++ (tv).tv_usec = (us) % USEC_PER_SEC; \ ++} while (0) ++ ++#endif /* _POSIXSELECT_H_ */ +--- a/readline/posixstat.h ++++ b/readline/posixstat.h +@@ -5,19 +5,19 @@ + + This file is part of GNU Bash, the Bourne Again SHell. + +- Bash is free software; you can redistribute it and/or modify it +- under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ Bash is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- Bash is distributed in the hope that it will be useful, but WITHOUT +- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +- License for more details. ++ Bash is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with Bash; see the file COPYING. If not, write to the Free +- Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ along with Bash. If not, see . ++*/ + + /* This file should be included instead of . + It relies on the local sys/stat.h to work though. */ +--- a/readline/readline.c ++++ b/readline/readline.c +@@ -1,25 +1,25 @@ + /* readline.c -- a general facility for reading lines of input + with emacs style editing and completion. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -49,6 +49,11 @@ + + #include + #include "posixjmp.h" ++#include ++ ++#if !defined (errno) ++extern int errno; ++#endif /* !errno */ + + /* System-specific feature definitions and include files. */ + #include "rldefs.h" +@@ -158,7 +163,7 @@ int rl_done; + rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL; + + /* Top level environment for readline_internal (). */ +-procenv_t readline_top_level; ++procenv_t _rl_top_level; + + /* The streams we interact with. */ + FILE *_rl_in_stream, *_rl_out_stream; +@@ -171,7 +176,7 @@ FILE *rl_outstream = (FILE *)NULL; + set to 1 if there is a controlling terminal, we can get its attributes, + and the attributes include `echo'. Look at rltty.c:prepare_terminal_settings + for the code that sets it. */ +-int readline_echoing_p = 0; ++int _rl_echoing_p = 0; + + /* Current prompt. */ + char *rl_prompt = (char *)NULL; +@@ -265,6 +270,15 @@ int _rl_output_meta_chars = 0; + them to equivalent readline functions at startup. */ + int _rl_bind_stty_chars = 1; + ++/* Non-zero means to go through the history list at every newline (or ++ whenever rl_done is set and readline returns) and revert each line to ++ its initial state. */ ++int _rl_revert_all_at_newline = 0; ++ ++/* Non-zero means to honor the termios ECHOCTL bit and echo control ++ characters corresponding to keyboard-generated signals. */ ++int _rl_echo_control_chars = 1; ++ + /* **************************************************************** */ + /* */ + /* Top Level Functions */ +@@ -295,6 +309,9 @@ readline (prompt) + const char *prompt; + { + char *value; ++#if 0 ++ int in_callback; ++#endif + + /* If we are at EOF return a NULL string. */ + if (rl_pending_input == EOF) +@@ -303,6 +320,15 @@ readline (prompt) + return ((char *)NULL); + } + ++#if 0 ++ /* If readline() is called after installing a callback handler, temporarily ++ turn off the callback state to avoid ensuing messiness. Patch supplied ++ by the gdb folks. XXX -- disabled. This can be fooled and readline ++ left in a strange state by a poorly-timed longjmp. */ ++ if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK)) ++ RL_UNSETSTATE (RL_STATE_CALLBACK); ++#endif ++ + rl_set_prompt (prompt); + + rl_initialize (); +@@ -321,6 +347,11 @@ readline (prompt) + rl_clear_signals (); + #endif + ++#if 0 ++ if (in_callback) ++ RL_SETSTATE (RL_STATE_CALLBACK); ++#endif ++ + return (value); + } + +@@ -344,14 +375,14 @@ readline_internal_setup () + /* If we're not echoing, we still want to at least print a prompt, because + rl_redisplay will not do it for us. If the calling application has a + custom redisplay function, though, let that function handle it. */ +- if (readline_echoing_p == 0 && rl_redisplay_function == rl_redisplay) ++ if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay) + { + if (rl_prompt && rl_already_prompted == 0) + { + nprompt = _rl_strip_prompt (rl_prompt); + fprintf (_rl_out_stream, "%s", nprompt); + fflush (_rl_out_stream); +- free (nprompt); ++ xfree (nprompt); + } + } + else +@@ -365,11 +396,13 @@ readline_internal_setup () + + #if defined (VI_MODE) + if (rl_editing_mode == vi_mode) +- rl_vi_insertion_mode (1, 'i'); ++ rl_vi_insert_mode (1, 'i'); + #endif /* VI_MODE */ + + if (rl_pre_input_hook) + (*rl_pre_input_hook) (); ++ ++ RL_CHECK_SIGNALS (); + } + + STATIC_CALLBACK char * +@@ -379,6 +412,8 @@ readline_internal_teardown (eof) + char *temp; + HIST_ENTRY *entry; + ++ RL_CHECK_SIGNALS (); ++ + /* Restore the original of this history line, iff the line that we + are editing was originally in the history, AND the line has changed. */ + entry = current_history (); +@@ -391,9 +426,12 @@ readline_internal_teardown (eof) + _rl_free_history_entry (entry); + + strcpy (the_line, temp); +- free (temp); ++ xfree (temp); + } + ++ if (_rl_revert_all_at_newline) ++ _rl_revert_all_lines (); ++ + /* At any rate, it is highly likely that this line has an undo list. Get + rid of it now. */ + if (rl_undo_list) +@@ -454,7 +492,7 @@ readline_internal_charloop () + #endif + lk = _rl_last_command_was_kill; + +- code = setjmp (readline_top_level); ++ code = setjmp (_rl_top_level); + + if (code) + { +@@ -462,7 +500,7 @@ readline_internal_charloop () + _rl_want_redisplay = 0; + /* If we get here, we're not being called from something dispatched + from _rl_callback_read_char(), which sets up its own value of +- readline_top_level (saving and restoring the old, of course), so ++ _rl_top_level (saving and restoring the old, of course), so + we can just return here. */ + if (RL_ISSTATE (RL_STATE_CALLBACK)) + return (0); +@@ -479,6 +517,20 @@ readline_internal_charloop () + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_READCMD); + ++ /* look at input.c:rl_getc() for the circumstances under which this will ++ be returned; punt immediately on read error without converting it to ++ a newline. */ ++ if (c == READERR) ++ { ++#if defined (READLINE_CALLBACKS) ++ RL_SETSTATE(RL_STATE_DONE); ++ return (rl_done = 1); ++#else ++ eof_found = 1; ++ break; ++#endif ++ } ++ + /* EOF typed to a non-blank line is a . */ + if (c == EOF && rl_end) + c = NEWLINE; +@@ -498,6 +550,7 @@ readline_internal_charloop () + + lastc = c; + _rl_dispatch ((unsigned char)c, _rl_keymap); ++ RL_CHECK_SIGNALS (); + + /* If there was no change in _rl_last_command_was_kill, then no kill + has taken place. Note that if input is pending we are reading +@@ -576,7 +629,7 @@ void + _rl_keyseq_cxt_dispose (cxt) + _rl_keyseq_cxt *cxt; + { +- free (cxt); ++ xfree (cxt); + } + + void +@@ -618,7 +671,6 @@ _rl_dispatch_callback (cxt) + int nkey, r; + + /* For now */ +-#if 1 + /* The first time this context is used, we want to read input and dispatch + on it. When traversing the chain of contexts back `up', we want to use + the value from the next context down. We're simulating recursion using +@@ -626,18 +678,22 @@ _rl_dispatch_callback (cxt) + if ((cxt->flags & KSEQ_DISPATCHED) == 0) + { + nkey = _rl_subseq_getchar (cxt->okey); ++ if (nkey < 0) ++ { ++ _rl_abort_internal (); ++ return -1; ++ } + r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg); + cxt->flags |= KSEQ_DISPATCHED; + } + else + r = cxt->childval; +-#else +- r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg); +-#endif + + /* For now */ +- r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); ++ if (r != -3) /* don't do this if we indicate there will be other matches */ ++ r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); + ++ RL_CHECK_SIGNALS (); + if (r == 0) /* success! */ + { + _rl_keyseq_chain_dispose (); +@@ -724,6 +780,8 @@ _rl_dispatch_subseq (key, map, got_subseq) + remember the last command executed in this variable. */ + if (rl_pending_input == 0 && map[key].function != rl_digit_argument) + rl_last_func = map[key].function; ++ ++ RL_CHECK_SIGNALS (); + } + else if (map[ANYOTHERKEY].function) + { +@@ -778,7 +836,7 @@ _rl_dispatch_subseq (key, map, got_subseq) + { + /* Return 0 only the first time, to indicate success to + _rl_callback_read_char. The rest of the time, we're called +- from _rl_dispatch_callback, so we return 3 to indicate ++ from _rl_dispatch_callback, so we return -3 to indicate + special handling is necessary. */ + r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0; + cxt = _rl_keyseq_cxt_alloc (); +@@ -842,7 +900,7 @@ _rl_subseq_result (r, map, key, got_subseq) + Keymap m; + int type, nt; + rl_command_func_t *func, *nf; +- ++ + if (r == -2) + /* We didn't match anything, and the keymap we're indexed into + shadowed a function previously bound to that prefix. Call +@@ -1116,6 +1174,10 @@ bind_arrow_keys () + + #if defined (VI_MODE) + bind_arrow_keys_internal (vi_movement_keymap); ++ /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC ++ in vi command mode while still allowing the arrow keys to work. */ ++ if (vi_movement_keymap[ESC].type == ISKMAP) ++ rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap); + bind_arrow_keys_internal (vi_insertion_keymap); + #endif + } +--- a/readline/readline.h ++++ b/readline/readline.h +@@ -1,24 +1,23 @@ + /* Readline.h -- the names of functions callable from within readline. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2011 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_READLINE_H_) + #define _READLINE_H_ +@@ -40,9 +39,9 @@ extern "C" { + #endif + + /* Hex-encoded Readline version number. */ +-#define RL_READLINE_VERSION 0x0501 /* Readline 5.1 */ +-#define RL_VERSION_MAJOR 5 +-#define RL_VERSION_MINOR 1 ++#define RL_READLINE_VERSION 0x0602 /* Readline 6.2 */ ++#define RL_VERSION_MAJOR 6 ++#define RL_VERSION_MINOR 2 + + /* Readline data structures. */ + +@@ -96,6 +95,7 @@ extern int rl_forward_word PARAMS((int, int)); + extern int rl_backward_word PARAMS((int, int)); + extern int rl_refresh_line PARAMS((int, int)); + extern int rl_clear_screen PARAMS((int, int)); ++extern int rl_skip_csi_sequence PARAMS((int, int)); + extern int rl_arrow_keys PARAMS((int, int)); + + /* Bindable commands for inserting and deleting text. */ +@@ -151,7 +151,9 @@ extern int rl_dump_variables PARAMS((int, int)); + extern int rl_complete PARAMS((int, int)); + extern int rl_possible_completions PARAMS((int, int)); + extern int rl_insert_completions PARAMS((int, int)); ++extern int rl_old_menu_complete PARAMS((int, int)); + extern int rl_menu_complete PARAMS((int, int)); ++extern int rl_backward_menu_complete PARAMS((int, int)); + + /* Bindable commands for killing and yanking text, and managing the kill ring. */ + extern int rl_kill_word PARAMS((int, int)); +@@ -233,6 +235,7 @@ extern int rl_vi_append_mode PARAMS((int, int)); + extern int rl_vi_append_eol PARAMS((int, int)); + extern int rl_vi_eof_maybe PARAMS((int, int)); + extern int rl_vi_insertion_mode PARAMS((int, int)); ++extern int rl_vi_insert_mode PARAMS((int, int)); + extern int rl_vi_movement_mode PARAMS((int, int)); + extern int rl_vi_arg_digit PARAMS((int, int)); + extern int rl_vi_change_case PARAMS((int, int)); +@@ -420,6 +423,7 @@ extern int rl_set_keyboard_input_timeout PARAMS((int)); + extern void rl_extend_line_buffer PARAMS((int)); + extern int rl_ding PARAMS((void)); + extern int rl_alphabetic PARAMS((int)); ++extern void rl_free PARAMS((void *)); + + /* Readline signal handling, from signals.c */ + extern int rl_set_signals PARAMS((void)); +@@ -427,7 +431,9 @@ extern int rl_clear_signals PARAMS((void)); + extern void rl_cleanup_after_signal PARAMS((void)); + extern void rl_reset_after_signal PARAMS((void)); + extern void rl_free_line_state PARAMS((void)); +- ++ ++extern void rl_echo_signal_char PARAMS((int)); ++ + extern int rl_set_paren_blink_timeout PARAMS((int)); + + /* Undocumented. */ +@@ -493,6 +499,10 @@ extern const char *rl_readline_name; + readline (), and should not be assigned to directly. */ + extern char *rl_prompt; + ++/* The prompt string that is actually displayed by rl_redisplay. Public so ++ applications can more easily supply their own redisplay functions. */ ++extern char *rl_display_prompt; ++ + /* The line buffer that is in use. */ + extern char *rl_line_buffer; + +@@ -599,6 +609,10 @@ extern int rl_catch_sigwinch; + filename completer. */ + extern rl_compentry_func_t *rl_completion_entry_function; + ++/* Optional generator for menu completion. Default is ++ rl_completion_entry_function (rl_filename_completion_function). */ ++ extern rl_compentry_func_t *rl_menu_completion_entry_function; ++ + /* If rl_ignore_some_completions_function is non-NULL it is the address + of a function to call after all of the possible matches have been + generated, but before the actual completion is done to the input line. +@@ -652,18 +666,37 @@ extern const char *rl_special_prefixes; + completing on a directory name. The function is called with + the address of a string (the current directory name) as an arg. It + changes what is displayed when the possible completions are printed +- or inserted. */ ++ or inserted. The directory completion hook should perform ++ any necessary dequoting. This function should return 1 if it modifies ++ the directory name pointer passed as an argument. If the directory ++ completion hook returns 0, it should not modify the directory name ++ pointer passed as an argument. */ + extern rl_icppfunc_t *rl_directory_completion_hook; + + /* If non-zero, this is the address of a function to call when completing + a directory name. This function takes the address of the directory name + to be modified as an argument. Unlike rl_directory_completion_hook, it + only modifies the directory name used in opendir(2), not what is displayed +- when the possible completions are printed or inserted. It is called +- before rl_directory_completion_hook. I'm not happy with how this works +- yet, so it's undocumented. */ ++ when the possible completions are printed or inserted. If set, it takes ++ precedence over rl_directory_completion_hook. The directory rewrite ++ hook should perform any necessary dequoting. This function has the same ++ return value properties as the directory_completion_hook. ++ ++ I'm not happy with how this works yet, so it's undocumented. I'm trying ++ it in bash to see how well it goes. */ + extern rl_icppfunc_t *rl_directory_rewrite_hook; + ++/* If non-zero, this is the address of a function to call when reading ++ directory entries from the filesystem for completion and comparing ++ them to the partial word to be completed. The function should ++ either return its first argument (if no conversion takes place) or ++ newly-allocated memory. This can, for instance, convert filenames ++ between character sets for comparison against what's typed at the ++ keyboard. The returned value is what is added to the list of ++ matches. The second argument is the length of the filename to be ++ converted. */ ++extern rl_dequote_func_t *rl_filename_rewrite_hook; ++ + /* Backwards compatibility with previous versions of readline. */ + #define rl_symbolic_link_hook rl_directory_completion_hook + +@@ -713,6 +746,9 @@ extern int rl_attempted_completion_over; + functions. */ + extern int rl_completion_type; + ++/* Set to the last key used to invoke one of the completion functions */ ++extern int rl_completion_invoking_key; ++ + /* Up to this many items will be displayed in response to a + possible-completions call. After that, we ask the user if she + is sure she wants to see them all. The default value is 100. */ +@@ -739,6 +775,9 @@ extern int rl_completion_found_quote; + application-specific completion function. */ + extern int rl_completion_suppress_quote; + ++/* If non-zero, readline will sort the completion matches. On by default. */ ++extern int rl_sort_completion_matches; ++ + /* If non-zero, a slash will be appended to completed filenames that are + symbolic links to directory names, subject to the value of the + mark-directories variable (which is user-settable). This exists so +@@ -757,6 +796,10 @@ extern int rl_ignore_completion_duplicates; + completion character will be inserted as any other. */ + extern int rl_inhibit_completion; + ++/* Input error; can be returned by (*rl_getc_function) if readline is reading ++ a top-level command (RL_ISSTATE (RL_STATE_READCMD)). */ ++#define READERR (-2) ++ + /* Definitions available for use by readline clients. */ + #define RL_PROMPT_START_IGNORE '\001' + #define RL_PROMPT_END_IGNORE '\002' +@@ -770,31 +813,32 @@ extern int rl_inhibit_completion; + /* Possible state values for rl_readline_state */ + #define RL_STATE_NONE 0x000000 /* no state; before first call */ + +-#define RL_STATE_INITIALIZING 0x000001 /* initializing */ +-#define RL_STATE_INITIALIZED 0x000002 /* initialization done */ +-#define RL_STATE_TERMPREPPED 0x000004 /* terminal is prepped */ +-#define RL_STATE_READCMD 0x000008 /* reading a command key */ +-#define RL_STATE_METANEXT 0x000010 /* reading input after ESC */ +-#define RL_STATE_DISPATCHING 0x000020 /* dispatching to a command */ +-#define RL_STATE_MOREINPUT 0x000040 /* reading more input in a command function */ +-#define RL_STATE_ISEARCH 0x000080 /* doing incremental search */ +-#define RL_STATE_NSEARCH 0x000100 /* doing non-inc search */ +-#define RL_STATE_SEARCH 0x000200 /* doing a history search */ +-#define RL_STATE_NUMERICARG 0x000400 /* reading numeric argument */ +-#define RL_STATE_MACROINPUT 0x000800 /* getting input from a macro */ +-#define RL_STATE_MACRODEF 0x001000 /* defining keyboard macro */ +-#define RL_STATE_OVERWRITE 0x002000 /* overwrite mode */ +-#define RL_STATE_COMPLETING 0x004000 /* doing completion */ +-#define RL_STATE_SIGHANDLER 0x008000 /* in readline sighandler */ +-#define RL_STATE_UNDOING 0x010000 /* doing an undo */ +-#define RL_STATE_INPUTPENDING 0x020000 /* rl_execute_next called */ +-#define RL_STATE_TTYCSAVED 0x040000 /* tty special chars saved */ +-#define RL_STATE_CALLBACK 0x080000 /* using the callback interface */ +-#define RL_STATE_VIMOTION 0x100000 /* reading vi motion arg */ +-#define RL_STATE_MULTIKEY 0x200000 /* reading multiple-key command */ +-#define RL_STATE_VICMDONCE 0x400000 /* entered vi command mode at least once */ +- +-#define RL_STATE_DONE 0x800000 /* done; accepted line */ ++#define RL_STATE_INITIALIZING 0x0000001 /* initializing */ ++#define RL_STATE_INITIALIZED 0x0000002 /* initialization done */ ++#define RL_STATE_TERMPREPPED 0x0000004 /* terminal is prepped */ ++#define RL_STATE_READCMD 0x0000008 /* reading a command key */ ++#define RL_STATE_METANEXT 0x0000010 /* reading input after ESC */ ++#define RL_STATE_DISPATCHING 0x0000020 /* dispatching to a command */ ++#define RL_STATE_MOREINPUT 0x0000040 /* reading more input in a command function */ ++#define RL_STATE_ISEARCH 0x0000080 /* doing incremental search */ ++#define RL_STATE_NSEARCH 0x0000100 /* doing non-inc search */ ++#define RL_STATE_SEARCH 0x0000200 /* doing a history search */ ++#define RL_STATE_NUMERICARG 0x0000400 /* reading numeric argument */ ++#define RL_STATE_MACROINPUT 0x0000800 /* getting input from a macro */ ++#define RL_STATE_MACRODEF 0x0001000 /* defining keyboard macro */ ++#define RL_STATE_OVERWRITE 0x0002000 /* overwrite mode */ ++#define RL_STATE_COMPLETING 0x0004000 /* doing completion */ ++#define RL_STATE_SIGHANDLER 0x0008000 /* in readline sighandler */ ++#define RL_STATE_UNDOING 0x0010000 /* doing an undo */ ++#define RL_STATE_INPUTPENDING 0x0020000 /* rl_execute_next called */ ++#define RL_STATE_TTYCSAVED 0x0040000 /* tty special chars saved */ ++#define RL_STATE_CALLBACK 0x0080000 /* using the callback interface */ ++#define RL_STATE_VIMOTION 0x0100000 /* reading vi motion arg */ ++#define RL_STATE_MULTIKEY 0x0200000 /* reading multiple-key command */ ++#define RL_STATE_VICMDONCE 0x0400000 /* entered vi command mode at least once */ ++#define RL_STATE_REDISPLAYING 0x0800000 /* updating terminal display */ ++ ++#define RL_STATE_DONE 0x1000000 /* done; accepted line */ + + #define RL_SETSTATE(x) (rl_readline_state |= (x)) + #define RL_UNSETSTATE(x) (rl_readline_state &= ~(x)) +--- a/readline/rlconf.h ++++ b/readline/rlconf.h +@@ -1,25 +1,23 @@ + /* rlconf.h -- readline configuration definitions */ + +-/* Copyright (C) 1994 Free Software Foundation, Inc. ++/* Copyright (C) 1992-2009 Free Software Foundation, Inc. + +- This file contains the Readline Library (the Library), a set of +- routines for providing Emacs style line input to programs that ask +- for it. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RLCONF_H_) + #define _RLCONF_H_ +@@ -37,9 +35,12 @@ + /* Ugly but working hack for binding prefix meta. */ + #define PREFIX_META_HACK + +-/* The final, last-ditch effort file name for an init file. */ ++/* The next-to-last-ditch effort file name for a user-specific init file. */ + #define DEFAULT_INPUTRC "~/.inputrc" + ++/* The ultimate last-ditch filenname for an init file -- system-wide. */ ++#define SYS_INPUTRC "/etc/inputrc" ++ + /* If defined, expand tabs to spaces. */ + #define DISPLAY_TABS + +--- a/readline/rldefs.h ++++ b/readline/rldefs.h +@@ -2,26 +2,24 @@ + for readline. This should be included after any files that define + system-specific constants like _POSIX_VERSION or USG. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file contains the Readline Library (the Library), a set of +- routines for providing Emacs style line input to programs that ask +- for it. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RLDEFS_H_) + #define _RLDEFS_H_ +@@ -32,6 +30,10 @@ + + #include "rlstdc.h" + ++#if defined (STRCOLL_BROKEN) ++# undef HAVE_STRCOLL ++#endif ++ + #if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING) + # define TERMIOS_TTY_DRIVER + #else +--- a/readline/rlmbutil.h ++++ b/readline/rlmbutil.h +@@ -1,24 +1,23 @@ + /* rlmbutil.h -- utility functions for multibyte characters. */ + +-/* Copyright (C) 2001, 2003 Free Software Foundation, Inc. ++/* Copyright (C) 2001-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RL_MBUTIL_H_) + #define _RL_MBUTIL_H_ +@@ -30,22 +29,21 @@ + /************************************************/ + + /* For platforms which support the ISO C amendement 1 functionality we +- support user defined character classes. +- +- Some platforms have the multibyte functions such as mbsrtowcs but +- are lacking the multitype type mbstate_t. BeOS (unknown version) +- and HP/UX 11.23 without _XOPEN_SOURCE=500 are like this. +- +- We really need mbstate_t type to operate properly. For example, see +- compute_lcd_of_matches, where two mbstate_t's are active at the same +- time. So we require both the functions and the mbstate_t type in +- order to enable multibyte support. */ +- ++ support user defined character classes. */ + /* Solaris 2.5 has a bug: must be included before . */ +-#if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) ++#if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) && defined (HAVE_LOCALE_H) + # include + # include +-# if defined (HAVE_MBSTATE_T) && defined (HAVE_MBSRTOWCS) && defined (HAVE_MBRTOWC) && defined (HAVE_MBRLEN) && defined (HAVE_WCWIDTH) ++# if defined (HAVE_ISWCTYPE) && \ ++ defined (HAVE_ISWLOWER) && \ ++ defined (HAVE_ISWUPPER) && \ ++ defined (HAVE_MBSRTOWCS) && \ ++ defined (HAVE_MBRTOWC) && \ ++ defined (HAVE_MBRLEN) && \ ++ defined (HAVE_TOWLOWER) && \ ++ defined (HAVE_TOWUPPER) && \ ++ defined (HAVE_WCHAR_T) && \ ++ defined (HAVE_WCWIDTH) + /* system is supposed to support XPG5 */ + # define HANDLE_MULTIBYTE 1 + # endif +--- a/readline/rlprivate.h ++++ b/readline/rlprivate.h +@@ -1,25 +1,24 @@ + /* rlprivate.h -- functions and variables global to the readline library, + but not intended for use by applications. */ + +-/* Copyright (C) 1999-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1999-2010 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RL_PRIVATE_H_) + #define _RL_PRIVATE_H_ +@@ -30,6 +29,21 @@ + + /************************************************************************* + * * ++ * Convenience definitions * ++ * * ++ *************************************************************************/ ++ ++#define EMACS_MODE() (rl_editing_mode == emacs_mode) ++#define VI_COMMAND_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap) ++#define VI_INSERT_MODE() (rl_editing_mode == vi_mode && _rl_keymap == vi_insertion_keymap) ++ ++#define RL_CHECK_SIGNALS() \ ++ do { \ ++ if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \ ++ } while (0) ++ ++/************************************************************************* ++ * * + * Global structs undocumented in texinfo manual and not in readline.h * + * * + *************************************************************************/ +@@ -42,6 +56,7 @@ + #define SF_REVERSE 0x01 + #define SF_FOUND 0x02 + #define SF_FAILED 0x04 ++#define SF_CHGKMAP 0x08 + + typedef struct __rl_search_context + { +@@ -65,6 +80,9 @@ typedef struct __rl_search_context + + UNDO_LIST *save_undo_list; + ++ Keymap keymap; /* used when dispatching commands in search string */ ++ Keymap okeymap; /* original keymap */ ++ + int history_pos; + int direction; + +@@ -106,7 +124,28 @@ typedef struct __rl_keyseq_context + int childval; + } _rl_keyseq_cxt; + +- /* fill in more as needed */ ++/* vi-mode commands that use result of motion command to define boundaries */ ++#define VIM_DELETE 0x01 ++#define VIM_CHANGE 0x02 ++#define VIM_YANK 0x04 ++ ++/* various states for vi-mode commands that use motion commands. reflects ++ RL_READLINE_STATE */ ++#define VMSTATE_READ 0x01 ++#define VMSTATE_NUMARG 0x02 ++ ++typedef struct __rl_vimotion_context ++{ ++ int op; ++ int state; ++ int flags; /* reserved */ ++ _rl_arg_cxt ncxt; ++ int numeric_arg; ++ int start, end; /* rl_point, rl_end */ ++ int key, motion; /* initial key, motion command */ ++} _rl_vimotion_cxt; ++ ++/* fill in more as needed */ + /* `Generic' callback data and functions */ + typedef struct __rl_callback_generic_arg + { +@@ -139,12 +178,9 @@ extern int rl_visible_stats; + extern int rl_line_buffer_len; + extern int rl_arg_sign; + extern int rl_visible_prompt_length; +-extern int readline_echoing_p; + extern int rl_key_sequence_length; + extern int rl_byte_oriented; + +-extern _rl_keyseq_cxt *_rl_kscxt; +- + /* display.c */ + extern int rl_display_fixed; + +@@ -206,6 +242,7 @@ extern void _rl_callback_data_dispose PARAMS((_rl_callback_generic_arg *)); + /* bind.c */ + + /* complete.c */ ++extern void _rl_reset_completion_state PARAMS((void)); + extern char _rl_find_completion_word PARAMS((int *, int *)); + extern void _rl_free_match_list PARAMS((char **)); + +@@ -261,6 +298,8 @@ extern void _rl_start_using_history PARAMS((void)); + extern int _rl_free_saved_history_line PARAMS((void)); + extern void _rl_set_insert_mode PARAMS((int, int)); + ++extern void _rl_revert_all_lines PARAMS((void)); ++ + /* nls.c */ + extern int _rl_init_eightbit PARAMS((void)); + +@@ -281,6 +320,14 @@ extern int _rl_restore_tty_signals PARAMS((void)); + /* search.c */ + extern int _rl_nsearch_callback PARAMS((_rl_search_cxt *)); + ++/* signals.c */ ++extern void _rl_signal_handler PARAMS((int)); ++ ++extern void _rl_block_sigint PARAMS((void)); ++extern void _rl_release_sigint PARAMS((void)); ++extern void _rl_block_sigwinch PARAMS((void)); ++extern void _rl_release_sigwinch PARAMS((void)); ++ + /* terminal.c */ + extern void _rl_get_screen_size PARAMS((int, int)); + extern int _rl_init_terminal_io PARAMS((const char *)); +@@ -298,6 +345,7 @@ extern void _rl_set_cursor PARAMS((int, int)); + /* text.c */ + extern void _rl_fix_point PARAMS((int)); + extern int _rl_replace_text PARAMS((const char *, int, int)); ++extern int _rl_forward_char_internal PARAMS((int)); + extern int _rl_insert_char PARAMS((int, int)); + extern int _rl_overwrite_char PARAMS((int, int)); + extern int _rl_overwrite_rubout PARAMS((int, int)); +@@ -309,8 +357,25 @@ extern int _rl_char_search_internal PARAMS((int, int, int)); + #endif + extern int _rl_set_mark_at_pos PARAMS((int)); + ++/* undo.c */ ++extern UNDO_LIST *_rl_copy_undo_entry PARAMS((UNDO_LIST *)); ++extern UNDO_LIST *_rl_copy_undo_list PARAMS((UNDO_LIST *)); ++ + /* util.c */ ++#if defined (USE_VARARGS) && defined (PREFER_STDARG) ++extern void _rl_ttymsg (const char *, ...) __attribute__((__format__ (printf, 1, 2))); ++extern void _rl_errmsg (const char *, ...) __attribute__((__format__ (printf, 1, 2))); ++extern void _rl_trace (const char *, ...) __attribute__((__format__ (printf, 1, 2))); ++#else ++extern void _rl_ttymsg (); ++extern void _rl_errmsg (); ++extern void _rl_trace (); ++#endif ++ ++extern int _rl_tropen PARAMS((void)); ++ + extern int _rl_abort_internal PARAMS((void)); ++extern int _rl_null_function PARAMS((int, int)); + extern char *_rl_strindex PARAMS((const char *, const char *)); + extern int _rl_qsort_string_compare PARAMS((char **, char **)); + extern int (_rl_uppercase_p) PARAMS((int)); +@@ -327,14 +392,15 @@ extern void _rl_vi_reset_last PARAMS((void)); + extern void _rl_vi_set_last PARAMS((int, int, int)); + extern int _rl_vi_textmod_command PARAMS((int)); + extern void _rl_vi_done_inserting PARAMS((void)); ++extern int _rl_vi_domove_callback PARAMS((_rl_vimotion_cxt *)); + + /************************************************************************* + * Undocumented private variables * + *************************************************************************/ + + /* bind.c */ +-extern const char *_rl_possible_control_prefixes[]; +-extern const char *_rl_possible_meta_prefixes[]; ++extern const char * const _rl_possible_control_prefixes[]; ++extern const char * const _rl_possible_meta_prefixes[]; + + /* callback.c */ + extern _rl_callback_func_t *_rl_callback_func; +@@ -345,17 +411,21 @@ extern int _rl_complete_show_all; + extern int _rl_complete_show_unmodified; + extern int _rl_complete_mark_directories; + extern int _rl_complete_mark_symlink_dirs; ++extern int _rl_completion_prefix_display_length; ++extern int _rl_completion_columns; + extern int _rl_print_completions_horizontally; + extern int _rl_completion_case_fold; ++extern int _rl_completion_case_map; + extern int _rl_match_hidden_files; + extern int _rl_page_completions; ++extern int _rl_skip_completed_text; ++extern int _rl_menu_complete_prefix_first; + + /* display.c */ + extern int _rl_vis_botlin; + extern int _rl_last_c_pos; + extern int _rl_suppress_redisplay; + extern int _rl_want_redisplay; +-extern char *rl_display_prompt; + + /* isearch.c */ + extern char *_rl_isearch_terminators; +@@ -372,6 +442,7 @@ extern int _rl_history_saved_point; + extern _rl_arg_cxt _rl_argcxt; + + /* readline.c */ ++extern int _rl_echoing_p; + extern int _rl_horizontal_scroll_mode; + extern int _rl_mark_modified_lines; + extern int _rl_bell_preference; +@@ -379,6 +450,8 @@ extern int _rl_meta_flag; + extern int _rl_convert_meta_chars_to_ascii; + extern int _rl_output_meta_chars; + extern int _rl_bind_stty_chars; ++extern int _rl_revert_all_at_newline; ++extern int _rl_echo_control_chars; + extern char *_rl_comment_begin; + extern unsigned char _rl_parsing_conditionalized_out; + extern Keymap _rl_keymap; +@@ -386,11 +459,22 @@ extern FILE *_rl_in_stream; + extern FILE *_rl_out_stream; + extern int _rl_last_command_was_kill; + extern int _rl_eof_char; +-extern procenv_t readline_top_level; ++extern procenv_t _rl_top_level; ++extern _rl_keyseq_cxt *_rl_kscxt; + + /* search.c */ + extern _rl_search_cxt *_rl_nscxt; + ++/* signals.c */ ++extern int _rl_interrupt_immediately; ++extern int volatile _rl_caught_signal; ++ ++extern int _rl_echoctl; ++ ++extern int _rl_intr_char; ++extern int _rl_quit_char; ++extern int _rl_susp_char; ++ + /* terminal.c */ + extern int _rl_enable_keypad; + extern int _rl_enable_meta; +@@ -404,6 +488,7 @@ extern char *_rl_term_up; + extern char *_rl_term_dc; + extern char *_rl_term_cr; + extern char *_rl_term_IC; ++extern char *_rl_term_forward_char; + extern int _rl_screenheight; + extern int _rl_screenwidth; + extern int _rl_screenchars; +@@ -416,5 +501,6 @@ extern int _rl_undo_group_level; + + /* vi_mode.c */ + extern int _rl_vi_last_command; ++extern _rl_vimotion_cxt *_rl_vimvcxt; + + #endif /* _RL_PRIVATE_H_ */ +--- a/readline/rlshell.h ++++ b/readline/rlshell.h +@@ -1,24 +1,23 @@ + /* rlshell.h -- utility functions normally provided by bash. */ + +-/* Copyright (C) 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1999-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RL_SHELL_H_) + #define _RL_SHELL_H_ +--- a/readline/rlstdc.h ++++ b/readline/rlstdc.h +@@ -1,23 +1,23 @@ +-/* stdc.h -- macros to make source compile on both ANSI C and K&R C +- compilers. */ ++/* stdc.h -- macros to make source compile on both ANSI C and K&R C compilers. */ + +-/* Copyright (C) 1993 Free Software Foundation, Inc. ++/* Copyright (C) 1993-2009 Free Software Foundation, Inc. + +- This file is part of GNU Bash, the Bourne Again SHell. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- Bash is free software; you can redistribute it and/or modify it +- under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- Bash is distributed in the hope that it will be useful, but WITHOUT +- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +- License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with Bash; see the file COPYING. If not, write to the Free +- Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ along with Readline. If not, see . ++*/ + + #if !defined (_RL_STDC_H_) + #define _RL_STDC_H_ +--- a/readline/rltty.c ++++ b/readline/rltty.c +@@ -3,23 +3,23 @@ + + /* Copyright (C) 1992-2005 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -52,77 +52,10 @@ extern int errno; + rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal; + rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal; + +-void _rl_block_sigint PARAMS((void)); +-void _rl_release_sigint PARAMS((void)); +- + static void set_winsize PARAMS((int)); + + /* **************************************************************** */ + /* */ +-/* Signal Management */ +-/* */ +-/* **************************************************************** */ +- +-#if defined (HAVE_POSIX_SIGNALS) +-static sigset_t sigint_set, sigint_oset; +-#else /* !HAVE_POSIX_SIGNALS */ +-# if defined (HAVE_BSD_SIGNALS) +-static int sigint_oldmask; +-# endif /* HAVE_BSD_SIGNALS */ +-#endif /* !HAVE_POSIX_SIGNALS */ +- +-static int sigint_blocked; +- +-/* Cause SIGINT to not be delivered until the corresponding call to +- _rl_release_sigint(). */ +-void +-_rl_block_sigint () +-{ +- if (sigint_blocked) +- return; +- +-#if defined (HAVE_POSIX_SIGNALS) +- sigemptyset (&sigint_set); +- sigemptyset (&sigint_oset); +- sigaddset (&sigint_set, SIGINT); +- sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset); +-#else /* !HAVE_POSIX_SIGNALS */ +-# if defined (HAVE_BSD_SIGNALS) +- sigint_oldmask = sigblock (sigmask (SIGINT)); +-# else /* !HAVE_BSD_SIGNALS */ +-# if defined (HAVE_USG_SIGHOLD) +- sighold (SIGINT); +-# endif /* HAVE_USG_SIGHOLD */ +-# endif /* !HAVE_BSD_SIGNALS */ +-#endif /* !HAVE_POSIX_SIGNALS */ +- +- sigint_blocked = 1; +-} +- +-/* Allow SIGINT to be delivered. */ +-void +-_rl_release_sigint () +-{ +- if (sigint_blocked == 0) +- return; +- +-#if defined (HAVE_POSIX_SIGNALS) +- sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL); +-#else +-# if defined (HAVE_BSD_SIGNALS) +- sigsetmask (sigint_oldmask); +-# else /* !HAVE_BSD_SIGNALS */ +-# if defined (HAVE_USG_SIGHOLD) +- sigrelse (SIGINT); +-# endif /* HAVE_USG_SIGHOLD */ +-# endif /* !HAVE_BSD_SIGNALS */ +-#endif /* !HAVE_POSIX_SIGNALS */ +- +- sigint_blocked = 0; +-} +- +-/* **************************************************************** */ +-/* */ + /* Saving and Restoring the TTY */ + /* */ + /* **************************************************************** */ +@@ -204,8 +137,9 @@ save_tty_chars (tiop) + + if (tiop->flags & TCHARS_SET) + { +- _rl_tty_chars.t_intr = tiop->tchars.t_intrc; +- _rl_tty_chars.t_quit = tiop->tchars.t_quitc; ++ _rl_intr_char = _rl_tty_chars.t_intr = tiop->tchars.t_intrc; ++ _rl_quit_char = _rl_tty_chars.t_quit = tiop->tchars.t_quitc; ++ + _rl_tty_chars.t_start = tiop->tchars.t_startc; + _rl_tty_chars.t_stop = tiop->tchars.t_stopc; + _rl_tty_chars.t_eof = tiop->tchars.t_eofc; +@@ -215,7 +149,8 @@ save_tty_chars (tiop) + + if (tiop->flags & LTCHARS_SET) + { +- _rl_tty_chars.t_susp = tiop->ltchars.t_suspc; ++ _rl_susp_char = _rl_tty_chars.t_susp = tiop->ltchars.t_suspc; ++ + _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc; + _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc; + _rl_tty_chars.t_flush = tiop->ltchars.t_flushc; +@@ -268,7 +203,7 @@ set_tty_settings (tty, tiop) + ioctl (tty, TIOCSETN, &(tiop->sgttyb)); + tiop->flags &= ~SGTTY_SET; + } +- readline_echoing_p = 1; ++ _rl_echoing_p = 1; + + #if defined (TIOCLSET) + if (tiop->flags & LFLAG_SET) +@@ -302,7 +237,8 @@ prepare_terminal_settings (meta_flag, oldtio, tiop) + int meta_flag; + TIOTYPE oldtio, *tiop; + { +- readline_echoing_p = (oldtio.sgttyb.sg_flags & ECHO); ++ _rl_echoing_p = (oldtio.sgttyb.sg_flags & ECHO); ++ _rl_echoctl = (oldtio.sgttyb.sg_flags & ECHOCTL); + + /* Copy the original settings to the structure we're going to use for + our settings. */ +@@ -433,10 +369,10 @@ save_tty_chars (tiop) + #ifdef VREPRINT + _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT]; + #endif +- _rl_tty_chars.t_intr = tiop->c_cc[VINTR]; +- _rl_tty_chars.t_quit = tiop->c_cc[VQUIT]; ++ _rl_intr_char = _rl_tty_chars.t_intr = tiop->c_cc[VINTR]; ++ _rl_quit_char = _rl_tty_chars.t_quit = tiop->c_cc[VQUIT]; + #ifdef VSUSP +- _rl_tty_chars.t_susp = tiop->c_cc[VSUSP]; ++ _rl_susp_char = _rl_tty_chars.t_susp = tiop->c_cc[VSUSP]; + #endif + #ifdef VDSUSP + _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP]; +@@ -464,7 +400,7 @@ static void + rltty_warning (msg) + char *msg; + { +- fprintf (stderr, "readline: warning: %s\n", msg); ++ _rl_errmsg ("warning: %s", msg); + } + #endif + +@@ -475,7 +411,7 @@ TIOTYPE *tp; + { + if ((tp->c_oflag & OPOST) == 0) + { +- rltty_warning ("turning on OPOST for terminal\r"); ++ _rl_errmsg ("warning: turning on OPOST for terminal\r"); + tp->c_oflag |= OPOST|ONLCR; + } + } +@@ -500,8 +436,8 @@ _get_tty_settings (tty, tiop) + } + if (OUTPUT_BEING_FLUSHED (tiop)) + { +-#if defined (FLUSHO) && defined (_AIX41) +- rltty_warning ("turning off output flushing"); ++#if defined (FLUSHO) ++ _rl_errmsg ("warning: turning off output flushing"); + tiop->c_lflag &= ~FLUSHO; + break; + #else +@@ -580,7 +516,10 @@ prepare_terminal_settings (meta_flag, oldtio, tiop) + int meta_flag; + TIOTYPE oldtio, *tiop; + { +- readline_echoing_p = (oldtio.c_lflag & ECHO); ++ _rl_echoing_p = (oldtio.c_lflag & ECHO); ++#if defined (ECHOCTL) ++ _rl_echoctl = (oldtio.c_lflag & ECHOCTL); ++#endif + + tiop->c_lflag &= ~(ICANON | ECHO); + +@@ -643,7 +582,7 @@ void + rl_prep_terminal (meta_flag) + int meta_flag; + { +- readline_echoing_p = 1; ++ _rl_echoing_p = 1; + } + + void +@@ -665,17 +604,19 @@ rl_prep_terminal (meta_flag) + /* Try to keep this function from being INTerrupted. */ + _rl_block_sigint (); + +- tty = fileno (rl_instream); ++ tty = rl_instream ? fileno (rl_instream) : fileno (stdin); + + if (get_tty_settings (tty, &tio) < 0) + { + #if defined (ENOTSUP) +- /* MacOS X, at least, lies about the value of errno if tcgetattr fails. */ +- if (errno == ENOTTY || errno == ENOTSUP) ++ /* MacOS X and Linux, at least, lie about the value of errno if ++ tcgetattr fails. */ ++ if (errno == ENOTTY || errno == EINVAL || errno == ENOTSUP) + #else +- if (errno == ENOTTY) ++ if (errno == ENOTTY || errno == EINVAL) + #endif +- readline_echoing_p = 1; /* XXX */ ++ _rl_echoing_p = 1; /* XXX */ ++ + _rl_release_sigint (); + return; + } +@@ -737,7 +678,7 @@ rl_deprep_terminal () + /* Try to keep this function from being interrupted. */ + _rl_block_sigint (); + +- tty = fileno (rl_instream); ++ tty = rl_instream ? fileno (rl_instream) : fileno (stdout); + + if (_rl_enable_keypad) + _rl_control_keypad (0); +@@ -862,7 +803,7 @@ set_special_char (kmap, tiop, sc, func) + } + + #define RESET_SPECIAL(c) \ +- if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) ++ if (c != -1 && kmap[(unsigned char)c].type == ISFUNC) \ + kmap[(unsigned char)c].function = rl_insert; + + static void +@@ -933,7 +874,6 @@ rltty_set_default_bindings (kmap) + #if !defined (NO_TTY_DRIVER) + TIOTYPE ttybuff; + int tty; +- static int called = 0; + + tty = fileno (rl_instream); + +--- a/readline/rltty.h ++++ b/readline/rltty.h +@@ -1,25 +1,23 @@ + /* rltty.h - tty driver-related definitions used by some library files. */ + +-/* Copyright (C) 1995 Free Software Foundation, Inc. ++/* Copyright (C) 1995-2009 Free Software Foundation, Inc. + +- This file contains the Readline Library (the Library), a set of +- routines for providing Emacs style line input to programs that ask +- for it. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RLTTY_H_) + #define _RLTTY_H_ +@@ -79,7 +77,4 @@ typedef struct _rl_tty_chars { + unsigned char t_status; + } _RL_TTY_CHARS; + +-extern void _rl_block_sigint PARAMS((void)); +-extern void _rl_release_sigint PARAMS((void)); +- + #endif /* _RLTTY_H_ */ +--- a/readline/rltypedefs.h ++++ b/readline/rltypedefs.h +@@ -1,24 +1,23 @@ + /* rltypedefs.h -- Type declarations for readline functions. */ + +-/* Copyright (C) 2000-2004 Free Software Foundation, Inc. ++/* Copyright (C) 2000-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #ifndef _RL_TYPEDEFS_H_ + #define _RL_TYPEDEFS_H_ +--- a/readline/rlwinsize.h ++++ b/readline/rlwinsize.h +@@ -1,26 +1,24 @@ + /* rlwinsize.h -- an attempt to isolate some of the system-specific defines + for `struct winsize' and TIOCGWINSZ. */ + +-/* Copyright (C) 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1997-2009 Free Software Foundation, Inc. + +- This file contains the Readline Library (the Library), a set of +- routines for providing Emacs style line input to programs that ask +- for it. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RLWINSIZE_H_) + #define _RLWINSIZE_H_ +@@ -53,5 +51,8 @@ + # endif /* HAVE_SYS_PTE_H */ + #endif /* !STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */ + +-#endif /* _RL_WINSIZE_H */ ++#if defined (M_UNIX) && !defined (_SCO_DS) && !defined (tcflow) ++# define tcflow(fd, action) ioctl(fd, TCXONC, action) ++#endif + ++#endif /* _RL_WINSIZE_H */ +--- a/readline/savestring.c ++++ b/readline/savestring.c +@@ -1,24 +1,24 @@ +-/* savestring.c */ ++/* savestring.c - function version of savestring for backwards compatibility */ + + /* Copyright (C) 1998,2003 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #include +@@ -33,5 +33,9 @@ char * + savestring (s) + const char *s; + { +- return ((char *)strcpy ((char *)xmalloc (1 + strlen (s)), (s))); ++ char *ret; ++ ++ ret = (char *)xmalloc (strlen (s) + 1); ++ strcpy (ret, s); ++ return ret; + } +--- a/readline/search.c ++++ b/readline/search.c +@@ -1,25 +1,24 @@ + /* search.c - code for non-incremental searching in emacs and vi modes. */ + +-/* Copyright (C) 1992-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1992-2009 Free Software Foundation, Inc. + +- This file is part of the Readline Library (the Library), a set of +- routines for providing Emacs style line input to programs that ask +- for it. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -70,7 +69,6 @@ static int rl_history_search_pos; + static char *history_search_string; + static int history_string_size; + +-static UNDO_LIST *noninc_saved_undo_list; + static void make_history_line_current PARAMS((HIST_ENTRY *)); + static int noninc_search_from_pos PARAMS((char *, int, int)); + static int noninc_dosearch PARAMS((char *, int)); +@@ -212,8 +210,8 @@ _rl_nsearch_init (dir, pchar) + rl_end = rl_point = 0; + + p = _rl_make_prompt_for_search (pchar ? pchar : ':'); +- rl_message (p, 0, 0); +- free (p); ++ rl_message ("%s", p, 0); ++ xfree (p); + + RL_SETSTATE(RL_STATE_NSEARCH); + +--- a/readline/shell.c ++++ b/readline/shell.c +@@ -1,25 +1,25 @@ + /* shell.c -- readline utility functions that are normally provided by + bash when readline is linked as part of the shell. */ + +-/* Copyright (C) 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1997-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -130,12 +130,12 @@ sh_set_lines_and_columns (lines, cols) + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); + sprintf (b, "%d", lines); + setenv ("LINES", b, 1); +- free (b); ++ xfree (b); + + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1); + sprintf (b, "%d", cols); + setenv ("COLUMNS", b, 1); +- free (b); ++ xfree (b); + #else /* !HAVE_SETENV */ + # if defined (HAVE_PUTENV) + b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1); +--- a/readline/shlib/Makefile.in ++++ b/readline/shlib/Makefile.in +@@ -1,21 +1,20 @@ + ## -*- text -*- ## + # Makefile for the GNU readline library shared library support. + # +-# Copyright (C) 1998-2003 Free Software Foundation, Inc. ++# Copyright (C) 1998-2009 Free Software Foundation, Inc. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# 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. ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . + + PACKAGE = @PACKAGE_NAME@ + VERSION = @PACKAGE_VERSION@ +@@ -31,7 +30,7 @@ RL_LIBRARY_NAME = readline + datarootdir = @datarootdir@ + + srcdir = @srcdir@ +-VPATH = .:@top_srcdir@ ++VPATH = @top_srcdir@ + topdir = @top_srcdir@ + BUILD_DIR = @BUILD_DIR@ + +@@ -51,6 +50,7 @@ LN = ln + SHELL = @MAKE_SHELL@ + + host_os = @host_os@ ++host_vendor = @host_vendor@ + + prefix = @prefix@ + exec_prefix = @exec_prefix@ +@@ -58,7 +58,7 @@ includedir = @includedir@ + bindir = @bindir@ + libdir = @libdir@ + datadir = @datadir@ +-localedir = $(datadir)/locale ++localedir = @localedir@ + + # Support an alternate destination root directory for package building + DESTDIR = +@@ -122,8 +122,6 @@ SHARED_READLINE = $(SHLIB_LIBPREF)readline$(SHLIB_DOT)$(SHLIB_LIBVERSION) + SHARED_HISTORY = $(SHLIB_LIBPREF)history$(SHLIB_DOT)$(SHLIB_LIBVERSION) + SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY) + +-WCWIDTH_OBJ = @WCWIDTH_OBJ@ +- + # The C code source files for this library. + CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \ + $(topdir)/vi_mode.c $(topdir)/parens.c $(topdir)/rltty.c \ +@@ -131,12 +129,12 @@ CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \ + $(topdir)/display.c $(topdir)/signals.c $(topdir)/emacs_keymap.c \ + $(topdir)/vi_keymap.c $(topdir)/util.c $(topdir)/kill.c \ + $(topdir)/undo.c $(topdir)/macro.c $(topdir)/input.c \ +- $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c \ ++ $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c $(topdir)/xfree.c \ + $(topdir)/history.c $(topdir)/histsearch.c $(topdir)/histexpand.c \ + $(topdir)/histfile.c $(topdir)/nls.c $(topdir)/search.c \ + $(topdir)/shell.c $(topdir)/savestring.c $(topdir)/tilde.c \ + $(topdir)/text.c $(topdir)/misc.c $(topdir)/compat.c \ +- $(topdir)/mbutil.c $(topdir)/support/wcwidth.c ++ $(topdir)/mbutil.c + + # The header files for this library. + HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \ +@@ -149,8 +147,8 @@ SHARED_TILDEOBJ = tilde.so + SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \ + rltty.so complete.so bind.so isearch.so display.so signals.so \ + util.so kill.so undo.so macro.so input.so callback.so terminal.so \ +- text.so nls.so misc.so xmalloc.so $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) \ +- compat.so $(WCWIDTH_OBJ) ++ text.so nls.so misc.so xmalloc.so xfree.so $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) \ ++ compat.so + + ########################################################################## + +@@ -170,13 +168,9 @@ $(SHARED_READLINE): $(SHARED_OBJ) + $(RM) $@ + $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_OBJ) $(SHLIB_LIBS) + +-$(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so +- $(RM) $@ +- $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so $(SHLIB_LIBS) +- +-wcwidth.o: $(srcdir)/support/wcwidth.c ++$(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so xfree.so + $(RM) $@ +- $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_FLAGS) $(srcdir)/support/wcwidth.c ++ $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so xfree.so $(SHLIB_LIBS) + + # Since tilde.c is shared between readline and bash, make sure we compile + # it with the right flags when it's built as part of readline +@@ -187,15 +181,16 @@ tilde.so: tilde.c + + installdirs: $(topdir)/support/mkdirs + -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(libdir) ++ -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(bindir) + + install: installdirs $(SHLIB_STATUS) +- $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY) +- $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_READLINE) ++ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY) ++ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_READLINE) + @echo install: you may need to run ldconfig + + uninstall: +- $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_HISTORY) +- $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_READLINE) ++ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_HISTORY) ++ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -V $(host_vendor) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_READLINE) + @echo uninstall: you may need to run ldconfig + + clean mostlyclean: force +@@ -322,6 +317,8 @@ vi_mode.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h + vi_mode.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h + vi_mode.so: $(topdir)/history.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h + vi_mode.so: $(topdir)/rltypedefs.h ++xfree.so: ${BUILD_DIR}/config.h ++xfree.so: $(topdir)/ansi_stdlib.h + xmalloc.so: ${BUILD_DIR}/config.h + xmalloc.so: $(topdir)/ansi_stdlib.h + +@@ -379,6 +376,7 @@ tilde.so: $(topdir)/xmalloc.h + undo.so: $(topdir)/xmalloc.h + util.so: $(topdir)/xmalloc.h + vi_mode.so: $(topdir)/xmalloc.h ++xfree.so: $(topdir)/xmalloc.h + xmalloc.so: $(topdir)/xmalloc.h + + complete.o: $(topdir)/rlmbutil.h +@@ -420,6 +418,7 @@ tilde.so: $(topdir)/tilde.c + undo.so: $(topdir)/undo.c + util.so: $(topdir)/util.c + vi_mode.so: $(topdir)/vi_mode.c ++xfree.so: $(topdir)/xfree.c + xmalloc.so: $(topdir)/xmalloc.c + + histexpand.so: $(topdir)/histexpand.c +@@ -454,6 +453,7 @@ tilde.so: tilde.c + undo.so: undo.c + util.so: util.c + vi_mode.so: vi_mode.c ++xfree.so: xfree.c + xmalloc.so: xmalloc.c + + histexpand.so: histexpand.c +--- a/readline/signals.c ++++ b/readline/signals.c +@@ -1,24 +1,24 @@ + /* signals.c -- signal handling support for readline. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -40,13 +40,14 @@ + # include + #endif /* GWINSZ_IN_SYS_IOCTL */ + +-#if defined (HANDLE_SIGNALS) + /* Some standard library routines. */ + #include "readline.h" + #include "history.h" + + #include "rlprivate.h" + ++#if defined (HANDLE_SIGNALS) ++ + #if !defined (RETSIGTYPE) + # if defined (VOID_SIGHANDLER) + # define RETSIGTYPE void +@@ -80,6 +81,9 @@ typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt + static SigHandler *rl_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *)); + static void rl_maybe_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *)); + ++static RETSIGTYPE rl_signal_handler PARAMS((int)); ++static RETSIGTYPE _rl_handle_signal PARAMS((int)); ++ + /* Exported variables for use by applications. */ + + /* If non-zero, readline will install its own signal handlers for +@@ -93,6 +97,18 @@ int rl_catch_sigwinch = 1; + int rl_catch_sigwinch = 0; /* for the readline state struct in readline.c */ + #endif + ++/* Private variables. */ ++int _rl_interrupt_immediately = 0; ++int volatile _rl_caught_signal = 0; /* should be sig_atomic_t, but that requires including everywhere */ ++ ++/* If non-zero, print characters corresponding to received signals as long as ++ the user has indicated his desire to do so (_rl_echo_control_chars). */ ++int _rl_echoctl = 0; ++ ++int _rl_intr_char = 0; ++int _rl_quit_char = 0; ++int _rl_susp_char = 0; ++ + static int signals_set_flag; + static int sigwinch_set_flag; + +@@ -112,10 +128,36 @@ static sighandler_cxt old_winch; + + /* Readline signal handler functions. */ + ++/* Called from RL_CHECK_SIGNALS() macro */ ++RETSIGTYPE ++_rl_signal_handler (sig) ++ int sig; ++{ ++ _rl_caught_signal = 0; /* XXX */ ++ ++ _rl_handle_signal (sig); ++ SIGHANDLER_RETURN; ++} ++ + static RETSIGTYPE + rl_signal_handler (sig) + int sig; + { ++ if (_rl_interrupt_immediately || RL_ISSTATE(RL_STATE_CALLBACK)) ++ { ++ _rl_interrupt_immediately = 0; ++ _rl_handle_signal (sig); ++ } ++ else ++ _rl_caught_signal = sig; ++ ++ SIGHANDLER_RETURN; ++} ++ ++static RETSIGTYPE ++_rl_handle_signal (sig) ++ int sig; ++{ + #if defined (HAVE_POSIX_SIGNALS) + sigset_t set; + #else /* !HAVE_POSIX_SIGNALS */ +@@ -142,6 +184,7 @@ rl_signal_handler (sig) + switch (sig) + { + case SIGINT: ++ _rl_reset_completion_state (); + rl_free_line_state (); + /* FALLTHROUGH */ + +@@ -157,9 +200,11 @@ rl_signal_handler (sig) + #if defined (SIGQUIT) + case SIGQUIT: + #endif ++ rl_echo_signal_char (sig); + rl_cleanup_after_signal (); + + #if defined (HAVE_POSIX_SIGNALS) ++ sigemptyset (&set); + sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set); + sigdelset (&set, sig); + #else /* !HAVE_POSIX_SIGNALS */ +@@ -251,11 +296,11 @@ rl_set_sighandler (sig, handler, ohandler) + struct sigaction act; + + act.sa_handler = handler; +-#if defined (SIGWINCH) ++# if defined (SIGWINCH) + act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0; +-#else ++# else + act.sa_flags = 0; +-#endif ++# endif /* SIGWINCH */ + sigemptyset (&act.sa_mask); + sigemptyset (&ohandler->sa_mask); + sigaction (sig, &act, &old_handler); +@@ -292,9 +337,44 @@ rl_set_signals () + { + sighandler_cxt dummy; + SigHandler *oh; ++#if defined (HAVE_POSIX_SIGNALS) ++ static int sigmask_set = 0; ++ static sigset_t bset, oset; ++#endif ++ ++#if defined (HAVE_POSIX_SIGNALS) ++ if (rl_catch_signals && sigmask_set == 0) ++ { ++ sigemptyset (&bset); ++ ++ sigaddset (&bset, SIGINT); ++ sigaddset (&bset, SIGTERM); ++#if defined (SIGQUIT) ++ sigaddset (&bset, SIGQUIT); ++#endif ++#if defined (SIGALRM) ++ sigaddset (&bset, SIGALRM); ++#endif ++#if defined (SIGTSTP) ++ sigaddset (&bset, SIGTSTP); ++#endif ++#if defined (SIGTTIN) ++ sigaddset (&bset, SIGTTIN); ++#endif ++#if defined (SIGTTOU) ++ sigaddset (&bset, SIGTTOU); ++#endif ++ sigmask_set = 1; ++ } ++#endif /* HAVE_POSIX_SIGNALS */ + + if (rl_catch_signals && signals_set_flag == 0) + { ++#if defined (HAVE_POSIX_SIGNALS) ++ sigemptyset (&oset); ++ sigprocmask (SIG_BLOCK, &bset, &oset); ++#endif ++ + rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int); + rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term); + #if defined (SIGQUIT) +@@ -328,6 +408,10 @@ rl_set_signals () + #endif /* SIGTTIN */ + + signals_set_flag = 1; ++ ++#if defined (HAVE_POSIX_SIGNALS) ++ sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL); ++#endif + } + + #if defined (SIGWINCH) +@@ -394,8 +478,8 @@ rl_cleanup_after_signal () + _rl_clean_up_for_exit (); + if (rl_deprep_term_function) + (*rl_deprep_term_function) (); +- rl_clear_signals (); + rl_clear_pending_input (); ++ rl_clear_signals (); + } + + /* Reset the terminal and readline state after a signal handler returns. */ +@@ -428,3 +512,160 @@ rl_free_line_state () + } + + #endif /* HANDLE_SIGNALS */ ++ ++/* **************************************************************** */ ++/* */ ++/* SIGINT Management */ ++/* */ ++/* **************************************************************** */ ++ ++#if defined (HAVE_POSIX_SIGNALS) ++static sigset_t sigint_set, sigint_oset; ++static sigset_t sigwinch_set, sigwinch_oset; ++#else /* !HAVE_POSIX_SIGNALS */ ++# if defined (HAVE_BSD_SIGNALS) ++static int sigint_oldmask; ++static int sigwinch_oldmask; ++# endif /* HAVE_BSD_SIGNALS */ ++#endif /* !HAVE_POSIX_SIGNALS */ ++ ++static int sigint_blocked; ++static int sigwinch_blocked; ++ ++/* Cause SIGINT to not be delivered until the corresponding call to ++ release_sigint(). */ ++void ++_rl_block_sigint () ++{ ++ if (sigint_blocked) ++ return; ++ ++#if defined (HAVE_POSIX_SIGNALS) ++ sigemptyset (&sigint_set); ++ sigemptyset (&sigint_oset); ++ sigaddset (&sigint_set, SIGINT); ++ sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset); ++#else /* !HAVE_POSIX_SIGNALS */ ++# if defined (HAVE_BSD_SIGNALS) ++ sigint_oldmask = sigblock (sigmask (SIGINT)); ++# else /* !HAVE_BSD_SIGNALS */ ++# if defined (HAVE_USG_SIGHOLD) ++ sighold (SIGINT); ++# endif /* HAVE_USG_SIGHOLD */ ++# endif /* !HAVE_BSD_SIGNALS */ ++#endif /* !HAVE_POSIX_SIGNALS */ ++ ++ sigint_blocked = 1; ++} ++ ++/* Allow SIGINT to be delivered. */ ++void ++_rl_release_sigint () ++{ ++ if (sigint_blocked == 0) ++ return; ++ ++#if defined (HAVE_POSIX_SIGNALS) ++ sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL); ++#else ++# if defined (HAVE_BSD_SIGNALS) ++ sigsetmask (sigint_oldmask); ++# else /* !HAVE_BSD_SIGNALS */ ++# if defined (HAVE_USG_SIGHOLD) ++ sigrelse (SIGINT); ++# endif /* HAVE_USG_SIGHOLD */ ++# endif /* !HAVE_BSD_SIGNALS */ ++#endif /* !HAVE_POSIX_SIGNALS */ ++ ++ sigint_blocked = 0; ++} ++ ++/* Cause SIGWINCH to not be delivered until the corresponding call to ++ release_sigwinch(). */ ++void ++_rl_block_sigwinch () ++{ ++ if (sigwinch_blocked) ++ return; ++ ++#if defined (HAVE_POSIX_SIGNALS) ++ sigemptyset (&sigwinch_set); ++ sigemptyset (&sigwinch_oset); ++ sigaddset (&sigwinch_set, SIGWINCH); ++ sigprocmask (SIG_BLOCK, &sigwinch_set, &sigwinch_oset); ++#else /* !HAVE_POSIX_SIGNALS */ ++# if defined (HAVE_BSD_SIGNALS) ++ sigwinch_oldmask = sigblock (sigmask (SIGWINCH)); ++# else /* !HAVE_BSD_SIGNALS */ ++# if defined (HAVE_USG_SIGHOLD) ++ sighold (SIGWINCH); ++# endif /* HAVE_USG_SIGHOLD */ ++# endif /* !HAVE_BSD_SIGNALS */ ++#endif /* !HAVE_POSIX_SIGNALS */ ++ ++ sigwinch_blocked = 1; ++} ++ ++/* Allow SIGWINCH to be delivered. */ ++void ++_rl_release_sigwinch () ++{ ++ if (sigwinch_blocked == 0) ++ return; ++ ++#if defined (HAVE_POSIX_SIGNALS) ++ sigprocmask (SIG_SETMASK, &sigwinch_oset, (sigset_t *)NULL); ++#else ++# if defined (HAVE_BSD_SIGNALS) ++ sigsetmask (sigwinch_oldmask); ++# else /* !HAVE_BSD_SIGNALS */ ++# if defined (HAVE_USG_SIGHOLD) ++ sigrelse (SIGWINCH); ++# endif /* HAVE_USG_SIGHOLD */ ++# endif /* !HAVE_BSD_SIGNALS */ ++#endif /* !HAVE_POSIX_SIGNALS */ ++ ++ sigwinch_blocked = 0; ++} ++ ++/* **************************************************************** */ ++/* */ ++/* Echoing special control characters */ ++/* */ ++/* **************************************************************** */ ++void ++rl_echo_signal_char (sig) ++ int sig; ++{ ++ char cstr[3]; ++ int cslen, c; ++ ++ if (_rl_echoctl == 0 || _rl_echo_control_chars == 0) ++ return; ++ ++ switch (sig) ++ { ++ case SIGINT: c = _rl_intr_char; break; ++#if defined (SIGQUIT) ++ case SIGQUIT: c = _rl_quit_char; break; ++#endif ++#if defined (SIGTSTP) ++ case SIGTSTP: c = _rl_susp_char; break; ++#endif ++ default: return; ++ } ++ ++ if (CTRL_CHAR (c) || c == RUBOUT) ++ { ++ cstr[0] = '^'; ++ cstr[1] = CTRL_CHAR (c) ? UNCTRL (c) : '?'; ++ cstr[cslen = 2] = '\0'; ++ } ++ else ++ { ++ cstr[0] = c; ++ cstr[cslen = 1] = '\0'; ++ } ++ ++ _rl_output_some_chars (cstr, cslen); ++} +old mode 100755 +new mode 100644 +--- a/readline/support/config.guess ++++ b/readline/support/config.guess +@@ -1,9 +1,10 @@ + #! /bin/sh + # Attempt to guess a canonical system name. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 ++# Free Software Foundation, Inc. + +-timestamp='2004-02-16' ++timestamp='2008-03-12' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -17,13 +18,15 @@ timestamp='2004-02-16' + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA ++# 02110-1301, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + ++ + # Originally written by Per Bothner . + # Please send patches to . Submit a context + # diff and a properly formatted ChangeLog entry. +@@ -53,8 +56,8 @@ version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +-Free Software Foundation, Inc. ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, ++2002, 2003, 2004, 2005, 2006, 2007, 2008,2009 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +@@ -66,11 +69,11 @@ Try \`$me --help' for more information." + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) +- echo "$timestamp" ; exit 0 ;; ++ echo "$timestamp" ; exit ;; + --version | -v ) +- echo "$version" ; exit 0 ;; ++ echo "$version" ; exit ;; + --help | --h* | -h ) +- echo "$usage"; exit 0 ;; ++ echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. +@@ -104,7 +107,7 @@ set_cc_for_build=' + trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; + trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; + : ${TMPDIR=/tmp} ; +- { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || ++ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +@@ -123,7 +126,7 @@ case $CC_FOR_BUILD,$HOST_CC,$CC in + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +-esac ;' ++esac ; set_cc_for_build= ;' + + # This is needed to find uname on a Pyramid OSx when run in the BSD universe. + # (ghazi@noc.rutgers.edu 1994-08-24) +@@ -158,6 +161,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; ++ sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched +@@ -196,68 +200,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" +- exit 0 ;; +- amd64:OpenBSD:*:*) +- echo x86_64-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- amiga:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- arc:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- cats:OpenBSD:*:*) +- echo arm-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- hp300:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mac68k:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- macppc:OpenBSD:*:*) +- echo powerpc-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvme68k:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvme88k:OpenBSD:*:*) +- echo m88k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvmeppc:OpenBSD:*:*) +- echo powerpc-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- pegasos:OpenBSD:*:*) +- echo powerpc-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- pmax:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- sgi:OpenBSD:*:*) +- echo mipseb-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- sun3:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- wgrisc:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:OpenBSD:*:*) +- echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; ++ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` ++ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} ++ exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; ++ *:SolidBSD:*:*) ++ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} ++ exit ;; + macppc:MirBSD:*:*) +- echo powerppc-unknown-mirbsd${UNAME_RELEASE} +- exit 0 ;; ++ echo powerpc-unknown-mirbsd${UNAME_RELEASE} ++ exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + alpha:OSF1:*:*) +- if test $UNAME_RELEASE = "V4.0"; then ++ case $UNAME_RELEASE in ++ *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` +- fi ++ ;; ++ *5.*) ++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ++ ;; ++ esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU +@@ -295,45 +263,49 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac ++ # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. +- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- exit 0 ;; +- Alpha*:OpenVMS:*:*) +- echo alpha-hp-vms +- exit 0 ;; ++ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ++ exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix +- exit 0 ;; ++ exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 +- exit 0 ;; ++ exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 +- exit 0;; ++ exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos +- exit 0 ;; ++ exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos +- exit 0 ;; ++ exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition +- exit 0 ;; ++ exit ;; ++ *:z/VM:*:*) ++ echo s390-ibm-zvmoe ++ exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 +- exit 0 ;; ++ exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} +- exit 0;; ++ exit ;; ++ arm:riscos:*:*|arm:RISCOS:*:*) ++ echo arm-unknown-riscos ++ exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp +- exit 0;; ++ exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then +@@ -341,32 +313,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + else + echo pyramid-pyramid-bsd + fi +- exit 0 ;; ++ exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 +- exit 0 ;; ++ exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 +- exit 0 ;; +- DRS?6000:UNIX_SV:4.2*:7*) ++ exit ;; ++ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in +- sparc) echo sparc-icl-nx7 && exit 0 ;; ++ sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; +- i86pc:SunOS:5.*:*) ++ exit ;; ++ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) +@@ -375,10 +347,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` +- exit 0 ;; ++ exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 +@@ -390,10 +362,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac +- exit 0 ;; ++ exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor +@@ -404,40 +376,40 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 +- exit 0 ;; ++ exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +@@ -461,32 +433,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + exit (-1); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c \ +- && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ +- && exit 0 ++ $CC_FOR_BUILD -o $dummy $dummy.c && ++ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && ++ SYSTEM_NAME=`$dummy $dummyarg` && ++ { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax +- exit 0 ;; ++ exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax +- exit 0 ;; ++ exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax +- exit 0 ;; ++ exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix +- exit 0 ;; ++ exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 +- exit 0 ;; ++ exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 +- exit 0 ;; ++ exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 +- exit 0 ;; ++ exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` +@@ -502,29 +475,29 @@ EOF + else + echo i586-dg-dgux${UNAME_RELEASE} + fi +- exit 0 ;; ++ exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 +- exit 0 ;; ++ exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 +- exit 0 ;; ++ exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 +- exit 0 ;; ++ exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd +- exit 0 ;; ++ exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` +- exit 0 ;; ++ exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. +- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id +- exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' ++ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id ++ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix +- exit 0 ;; ++ exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` +@@ -532,7 +505,7 @@ EOF + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} +- exit 0 ;; ++ exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build +@@ -547,15 +520,19 @@ EOF + exit(0); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 +- echo rs6000-ibm-aix3.2.5 ++ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` ++ then ++ echo "$SYSTEM_NAME" ++ else ++ echo rs6000-ibm-aix3.2.5 ++ fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi +- exit 0 ;; +- *:AIX:*:[45]) ++ exit ;; ++ *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 +@@ -568,28 +545,28 @@ EOF + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} +- exit 0 ;; ++ exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix +- exit 0 ;; ++ exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 +- exit 0 ;; ++ exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to +- exit 0 ;; # report: romp-ibm BSD 4.3 ++ exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx +- exit 0 ;; ++ exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 +- exit 0 ;; ++ exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd +- exit 0 ;; ++ exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 +- exit 0 ;; ++ exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in +@@ -651,9 +628,19 @@ EOF + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then +- # avoid double evaluation of $set_cc_for_build +- test -n "$CC_FOR_BUILD" || eval $set_cc_for_build +- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null ++ eval $set_cc_for_build ++ ++ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating ++ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler ++ # generating 64-bit code. GNU and HP use different nomenclature: ++ # ++ # $ CC_FOR_BUILD=cc ./config.guess ++ # => hppa2.0w-hp-hpux11.23 ++ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess ++ # => hppa64-hp-hpux11.23 ++ ++ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | ++ grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else +@@ -661,11 +648,11 @@ EOF + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} +- exit 0 ;; ++ exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} +- exit 0 ;; ++ exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +@@ -693,163 +680,192 @@ EOF + exit (0); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 ++ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && ++ { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 +- exit 0 ;; ++ exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd +- exit 0 ;; ++ exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd +- exit 0 ;; ++ exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix +- exit 0 ;; ++ exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf +- exit 0 ;; ++ exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf +- exit 0 ;; ++ exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi +- exit 0 ;; ++ exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites +- exit 0 ;; ++ exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd +- exit 0 ;; ++ exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi +- exit 0 ;; ++ exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd +- exit 0 ;; ++ exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd +- exit 0 ;; ++ exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd +- exit 0 ;; ++ exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + *:UNICOS/mp:*:*) +- echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +- exit 0 ;; ++ exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +- exit 0 ;; ++ exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:FreeBSD:*:*) +- # Determine whether the default compiler uses glibc. +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c +- #include +- #if __GLIBC__ >= 2 +- LIBC=gnu +- #else +- LIBC= +- #endif +-EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` +- # GNU/KFreeBSD systems have a "k" prefix to indicate we are using +- # FreeBSD's kernel, but not the complete OS. +- case ${LIBC} in gnu) kernel_only='k' ;; esac +- echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} +- exit 0 ;; ++ case ${UNAME_MACHINE} in ++ pc98) ++ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ amd64) ++ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ *) ++ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ esac ++ exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin +- exit 0 ;; +- i*:MINGW*:*) ++ exit ;; ++ *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 +- exit 0 ;; ++ exit ;; ++ i*:windows32*:*) ++ # uname -m includes "-pc" on this system. ++ echo ${UNAME_MACHINE}-mingw32 ++ exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 +- exit 0 ;; +- x86:Interix*:[34]*) +- echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' +- exit 0 ;; ++ exit ;; ++ *:Interix*:[3456]*) ++ case ${UNAME_MACHINE} in ++ x86) ++ echo i586-pc-interix${UNAME_RELEASE} ++ exit ;; ++ EM64T | authenticamd) ++ echo x86_64-unknown-interix${UNAME_RELEASE} ++ exit ;; ++ IA64) ++ echo ia64-unknown-interix${UNAME_RELEASE} ++ exit ;; ++ esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks +- exit 0 ;; ++ exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix +- exit 0 ;; ++ exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin +- exit 0 ;; ++ exit ;; ++ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) ++ echo x86_64-unknown-cygwin ++ exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin +- exit 0 ;; ++ exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` +- exit 0 ;; ++ exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu +- exit 0 ;; ++ exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix +- exit 0 ;; ++ exit ;; + arm*:Linux:*:*) ++ eval $set_cc_for_build ++ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_EABI__ ++ then ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ else ++ echo ${UNAME_MACHINE}-unknown-linux-gnueabi ++ fi ++ exit ;; ++ avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu +- exit 0 ;; ++ exit ;; ++ crisv32:Linux:*:*) ++ echo crisv32-axis-linux-gnu ++ exit ;; ++ frv:Linux:*:*) ++ echo frv-unknown-linux-gnu ++ exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ exit ;; ++ m32r*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +@@ -866,8 +882,12 @@ EOF + #endif + #endif + EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` +- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ++ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' ++ /^CPU/{ ++ s: ::g ++ p ++ }'`" ++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build +@@ -885,15 +905,22 @@ EOF + #endif + #endif + EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` +- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ++ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' ++ /^CPU/{ ++ s: ::g ++ p ++ }'`" ++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; ++ or32:Linux:*:*) ++ echo or32-unknown-linux-gnu ++ exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu +- exit 0 ;; ++ exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu +- exit 0 ;; ++ exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; +@@ -907,7 +934,7 @@ EOF + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} +- exit 0 ;; ++ exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in +@@ -915,25 +942,31 @@ EOF + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac +- exit 0 ;; ++ exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu +- exit 0 ;; ++ exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux +- exit 0 ;; ++ exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ exit ;; ++ vax:Linux:*:*) ++ echo ${UNAME_MACHINE}-dec-linux-gnu ++ exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu +- exit 0 ;; ++ exit ;; ++ xtensa*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent +@@ -951,15 +984,15 @@ EOF + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" +- exit 0 ;; ++ exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" +- exit 0 ;; ++ exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" +- exit 0 ;; ++ exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build +@@ -976,7 +1009,7 @@ EOF + LIBC=gnulibc1 + # endif + #else +- #ifdef __INTEL_COMPILER ++ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout +@@ -986,16 +1019,23 @@ EOF + LIBC=dietlibc + #endif + EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` +- test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 +- test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ++ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' ++ /^LIBC/{ ++ s: ::g ++ p ++ }'`" ++ test x"${LIBC}" != x && { ++ echo "${UNAME_MACHINE}-pc-linux-${LIBC}" ++ exit ++ } ++ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 +- exit 0 ;; ++ exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... +@@ -1003,27 +1043,27 @@ EOF + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} +- exit 0 ;; ++ exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx +- exit 0 ;; ++ exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop +- exit 0 ;; ++ exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos +- exit 0 ;; +- i*86:syllable:*:*) ++ exit ;; ++ i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable +- exit 0 ;; ++ exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp +- exit 0 ;; ++ exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then +@@ -1031,15 +1071,16 @@ EOF + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi +- exit 0 ;; +- i*86:*:5:[78]*) ++ exit ;; ++ i*86:*:5:[678]*) ++ # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} +- exit 0 ;; ++ exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi +- exit 0 ;; ++ exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv +- exit 0 ;; ++ exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv +- exit 0 ;; ++ exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix +- exit 0 ;; +- M68*:*:R3V[567]*:*) +- test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; +- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) ++ exit ;; ++ M68*:*:R3V[5678]*:*) ++ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; ++ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && echo i486-ncr-sysv4.3${OS_REL} && exit 0 ++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ +- && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; ++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && echo i486-ncr-sysv4 && exit 0 ;; ++ && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 +- exit 0 ;; ++ exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 +- exit 0 ;; ++ exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 +- exit 0 ;; ++ exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` +@@ -1131,68 +1172,84 @@ EOF + else + echo ns32k-sni-sysv + fi +- exit 0 ;; ++ exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 +- exit 0 ;; ++ exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 +- exit 0 ;; ++ exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 +- exit 0 ;; ++ exit ;; ++ i*86:VOS:*:*) ++ # From Paul.Green@stratus.com. ++ echo ${UNAME_MACHINE}-stratus-vos ++ exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos +- exit 0 ;; ++ exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 +- exit 0 ;; ++ exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi +- exit 0 ;; ++ exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos +- exit 0 ;; ++ exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos +- exit 0 ;; ++ exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos +- exit 0 ;; ++ exit ;; ++ BePC:Haiku:*:*) # Haiku running on Intel PC compatible. ++ echo i586-pc-haiku ++ exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; ++ SX-7:SUPER-UX:*:*) ++ echo sx7-nec-superux${UNAME_RELEASE} ++ exit ;; ++ SX-8:SUPER-UX:*:*) ++ echo sx8-nec-superux${UNAME_RELEASE} ++ exit ;; ++ SX-8R:SUPER-UX:*:*) ++ echo sx8r-nec-superux${UNAME_RELEASE} ++ exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:Darwin:*:*) +- case `uname -p` in +- *86) UNAME_PROCESSOR=i686 ;; +- powerpc) UNAME_PROCESSOR=powerpc ;; ++ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown ++ case $UNAME_PROCESSOR in ++ unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then +@@ -1200,22 +1257,25 @@ EOF + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:QNX:*:4*) + echo i386-pc-qnx +- exit 0 ;; ++ exit ;; ++ NSE-?:NONSTOP_KERNEL:*:*) ++ echo nse-tandem-nsk${UNAME_RELEASE} ++ exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux +- exit 0 ;; ++ exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv +- exit 0 ;; ++ exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 +@@ -1226,31 +1286,47 @@ EOF + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 +- exit 0 ;; ++ exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 +- exit 0 ;; ++ exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex +- exit 0 ;; ++ exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 +- exit 0 ;; ++ exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 +- exit 0 ;; ++ exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 +- exit 0 ;; ++ exit ;; + *:ITS:*:*) + echo pdp10-unknown-its +- exit 0 ;; ++ exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` +- exit 0 ;; ++ exit ;; ++ *:*VMS:*:*) ++ UNAME_MACHINE=`(uname -p) 2>/dev/null` ++ case "${UNAME_MACHINE}" in ++ A*) echo alpha-dec-vms ; exit ;; ++ I*) echo ia64-dec-vms ; exit ;; ++ V*) echo vax-dec-vms ; exit ;; ++ esac ;; ++ *:XENIX:*:SysV) ++ echo i386-pc-xenix ++ exit ;; ++ i*86:skyos:*:*) ++ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' ++ exit ;; ++ i*86:rdos:*:*) ++ echo ${UNAME_MACHINE}-pc-rdos ++ exit ;; + esac + + #echo '(No uname command or uname output not recognized.)' 1>&2 +@@ -1282,7 +1358,7 @@ main () + #endif + + #if defined (__arm) && defined (__acorn) && defined (__unix) +- printf ("arm-acorn-riscix"); exit (0); ++ printf ("arm-acorn-riscix\n"); exit (0); + #endif + + #if defined (hp300) && !defined (hpux) +@@ -1371,11 +1447,12 @@ main () + } + EOF + +-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 ++$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && ++ { echo "$SYSTEM_NAME"; exit; } + + # Apollos put the system type in the environment. + +-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } ++test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + + # Convex versions that predate uname can use getsysinfo(1) + +@@ -1384,22 +1461,22 @@ then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd +- exit 0 ;; ++ exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi +- exit 0 ;; ++ exit ;; + c34*) + echo c34-convex-bsd +- exit 0 ;; ++ exit ;; + c38*) + echo c38-convex-bsd +- exit 0 ;; ++ exit ;; + c4*) + echo c4-convex-bsd +- exit 0 ;; ++ exit ;; + esac + fi + +@@ -1410,7 +1487,9 @@ This script, last modified $timestamp, has failed to recognize + the operating system you are using. It is advised that you + download the most up to date version of the config scripts from + +- ftp://ftp.gnu.org/pub/gnu/config/ ++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD ++and ++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + + If the version you run ($0) is already up to date, please + send the following data and any information you think might be +old mode 100755 +new mode 100644 +--- a/readline/support/config.rpath ++++ b/readline/support/config.rpath +@@ -6,19 +6,18 @@ + # Taken from GNU libtool, 2001 + # Originally by Gordon Matzigkeit , 1996 + # +-# This program is free software; you can redistribute it and/or modify ++# This program is free software: you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# 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. ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# along with this program. If not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a +old mode 100755 +new mode 100644 +--- a/readline/support/config.sub ++++ b/readline/support/config.sub +@@ -1,9 +1,10 @@ + #! /bin/sh + # Configuration validation subroutine script. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 20098 ++# Free Software Foundation, Inc. + +-timestamp='2004-02-16' ++timestamp='2008-03-26' + + # This file is (in principle) common to ALL GNU software. + # The presence of a machine in this file suggests that SOME GNU software +@@ -21,14 +22,15 @@ timestamp='2004-02-16' + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, +-# Boston, MA 02111-1307, USA. +- ++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA ++# 02110-1301, USA. ++# + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + ++ + # Please send patches to . Submit a context + # diff and a properly formatted ChangeLog entry. + # +@@ -70,8 +72,8 @@ Report bugs and patches to ." + version="\ + GNU config.sub ($timestamp) + +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +-Free Software Foundation, Inc. ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, ++2002, 2003, 2004, 2005, 2006, 2007, 2008,2009 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +@@ -83,11 +85,11 @@ Try \`$me --help' for more information." + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) +- echo "$timestamp" ; exit 0 ;; ++ echo "$timestamp" ; exit ;; + --version | -v ) +- echo "$version" ; exit 0 ;; ++ echo "$version" ; exit ;; + --help | --h* | -h ) +- echo "$usage"; exit 0 ;; ++ echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. +@@ -99,7 +101,7 @@ while test $# -gt 0 ; do + *local*) + # First pass through any local machine types. + echo $1 +- exit 0;; ++ exit ;; + + * ) + break ;; +@@ -118,8 +120,9 @@ esac + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ +- kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ ++ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ ++ storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -145,7 +148,7 @@ case $os in + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple | -axis) ++ -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; +@@ -170,6 +173,10 @@ case $os in + -hiux*) + os=-hiuxwe2 + ;; ++ -sco6) ++ os=-sco5v6 ++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ++ ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +@@ -186,6 +193,10 @@ case $os in + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; ++ -sco5v6*) ++ # Don't forget version if it is 3.2v4 or newer. ++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ++ ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +@@ -230,22 +241,27 @@ case $basic_machine in + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ +- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ ++ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ ++ | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ +- | fr30 | frv \ ++ | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ +- | m32r | m68000 | m68k | m88k | mcore \ ++ | m32c | m32r | m32rle | m68000 | m68k | m88k \ ++ | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ +- | mips64vr | mips64vrel \ ++ | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ ++ | mips64r5900 | mips64r5900el \ ++ | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ ++ | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ +@@ -254,20 +270,24 @@ case $basic_machine in + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ ++ | mt \ + | msp430 \ ++ | nios | nios2 \ + | ns16k | ns32k \ +- | openrisc | or32 \ ++ | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ +- | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ ++ | score \ ++ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ +- | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ +- | strongarm \ ++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ ++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ ++ | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ +- | x86 | xscale | xstormy16 | xtensa \ ++ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; +@@ -278,6 +298,9 @@ case $basic_machine in + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; ++ ms1) ++ basic_machine=mt-unknown ++ ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and +@@ -297,28 +320,31 @@ case $basic_machine in + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ +- | avr-* \ +- | bs2000-* \ ++ | avr-* | avr32-* \ ++ | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ +- | clipper-* | cydra-* \ ++ | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ +- | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ ++ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ +- | m32r-* \ ++ | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ +- | m88110-* | m88k-* | mcore-* \ ++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ +- | mips64vr-* | mips64vrel-* \ ++ | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ ++ | mips64r5900-* | mips64r5900el-* \ ++ | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ ++ | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ +@@ -326,27 +352,35 @@ case $basic_machine in + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ ++ | mmix-* \ ++ | mt-* \ + | msp430-* \ +- | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ ++ | nios-* | nios2-* \ ++ | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ +- | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ ++ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ +- | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ +- | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ ++ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ ++ | sparclite-* \ ++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ +- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ ++ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ +- | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ +- | xtensa-* \ ++ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ ++ | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-*) + ;; ++ # Recognize the basic CPU types without company name, with glob match. ++ xtensa*) ++ basic_machine=$basic_machine-unknown ++ ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) +@@ -417,6 +451,14 @@ case $basic_machine in + basic_machine=ns32k-sequent + os=-dynix + ;; ++ blackfin) ++ basic_machine=bfin-unknown ++ os=-linux ++ ;; ++ blackfin-*) ++ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; + c90) + basic_machine=c90-cray + os=-unicos +@@ -445,16 +487,27 @@ case $basic_machine in + basic_machine=j90-cray + os=-unicos + ;; +- cr16c) +- basic_machine=cr16c-unknown ++ craynv) ++ basic_machine=craynv-cray ++ os=-unicosmp ++ ;; ++ cr16) ++ basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; ++ crisv32 | crisv32-* | etraxfs*) ++ basic_machine=crisv32-axis ++ ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; ++ crx) ++ basic_machine=crx-unknown ++ os=-elf ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; +@@ -477,6 +530,10 @@ case $basic_machine in + basic_machine=m88k-motorola + os=-sysv3 + ;; ++ djgpp) ++ basic_machine=i586-pc ++ os=-msdosdjgpp ++ ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx +@@ -627,6 +684,14 @@ case $basic_machine in + basic_machine=m68k-isi + os=-sysv + ;; ++ m68knommu) ++ basic_machine=m68k-unknown ++ os=-linux ++ ;; ++ m68knommu-*) ++ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; + m88k-omron*) + basic_machine=m88k-omron + ;; +@@ -642,6 +707,10 @@ case $basic_machine in + basic_machine=i386-pc + os=-mingw32 + ;; ++ mingw32ce) ++ basic_machine=arm-unknown ++ os=-mingw32ce ++ ;; + miniframe) + basic_machine=m68000-convergent + ;; +@@ -655,10 +724,6 @@ case $basic_machine in + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; +- mmix*) +- basic_machine=mmix-knuth +- os=-mmixware +- ;; + monitor) + basic_machine=m68k-rom68k + os=-coff +@@ -671,6 +736,9 @@ case $basic_machine in + basic_machine=i386-pc + os=-msdos + ;; ++ ms1-*) ++ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ++ ;; + mvs) + basic_machine=i370-ibm + os=-mvs +@@ -739,9 +807,8 @@ case $basic_machine in + np1) + basic_machine=np1-gould + ;; +- nv1) +- basic_machine=nv1-cray +- os=-unicosmp ++ nse-tandem) ++ basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem +@@ -750,9 +817,8 @@ case $basic_machine in + basic_machine=hppa1.1-oki + os=-proelf + ;; +- or32 | or32-*) ++ openrisc | openrisc-*) + basic_machine=or32-unknown +- os=-coff + ;; + os400) + basic_machine=powerpc-ibm +@@ -774,6 +840,14 @@ case $basic_machine in + basic_machine=i860-intel + os=-osf + ;; ++ parisc) ++ basic_machine=hppa-unknown ++ os=-linux ++ ;; ++ parisc-*) ++ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; + pbd) + basic_machine=sparc-tti + ;; +@@ -783,6 +857,12 @@ case $basic_machine in + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; ++ pc98) ++ basic_machine=i386-pc ++ ;; ++ pc98-*) ++ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; +@@ -839,6 +919,10 @@ case $basic_machine in + basic_machine=i586-unknown + os=-pw32 + ;; ++ rdos) ++ basic_machine=i386-pc ++ os=-rdos ++ ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff +@@ -865,6 +949,10 @@ case $basic_machine in + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; ++ sde) ++ basic_machine=mipsisa32-sde ++ os=-elf ++ ;; + sei) + basic_machine=mips-sei + os=-seiux +@@ -876,6 +964,9 @@ case $basic_machine in + basic_machine=sh-hitachi + os=-hms + ;; ++ sh5el) ++ basic_machine=sh5le-unknown ++ ;; + sh64) + basic_machine=sh64-unknown + ;; +@@ -965,6 +1056,10 @@ case $basic_machine in + basic_machine=tic6x-unknown + os=-coff + ;; ++ tile*) ++ basic_machine=tile-unknown ++ os=-linux-gnu ++ ;; + tx39) + basic_machine=mipstx39-unknown + ;; +@@ -1025,6 +1120,10 @@ case $basic_machine in + basic_machine=hppa1.1-winbond + os=-proelf + ;; ++ xbox) ++ basic_machine=i686-pc ++ os=-mingw32 ++ ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; +@@ -1055,6 +1154,9 @@ case $basic_machine in + romp) + basic_machine=romp-ibm + ;; ++ mmix) ++ basic_machine=mmix-knuth ++ ;; + rs6000) + basic_machine=rs6000-ibm + ;; +@@ -1071,13 +1173,10 @@ case $basic_machine in + we32k) + basic_machine=we32k-att + ;; +- sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) ++ sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; +- sh64) +- basic_machine=sh64-unknown +- ;; +- sparc | sparcv9 | sparcv9b) ++ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) +@@ -1150,20 +1249,23 @@ case $os in + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ +- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ ++ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ ++ | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ +- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) ++ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ ++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) +@@ -1181,7 +1283,7 @@ case $os in + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ +- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ ++ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) +@@ -1290,6 +1392,9 @@ case $os in + -kaos*) + os=-kaos + ;; ++ -zvmoe) ++ os=-zvmoe ++ ;; + -none) + ;; + *) +@@ -1312,6 +1417,12 @@ else + # system, and we'll never get to this point. + + case $basic_machine in ++ score-*) ++ os=-elf ++ ;; ++ spu-*) ++ os=-elf ++ ;; + *-acorn) + os=-riscix1.2 + ;; +@@ -1321,9 +1432,9 @@ case $basic_machine in + arm*-semi) + os=-aout + ;; +- c4x-* | tic4x-*) +- os=-coff +- ;; ++ c4x-* | tic4x-*) ++ os=-coff ++ ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 +@@ -1349,6 +1460,9 @@ case $basic_machine in + m68*-cisco) + os=-aout + ;; ++ mep-*) ++ os=-elf ++ ;; + mips*-cisco) + os=-elf + ;; +@@ -1367,9 +1481,15 @@ case $basic_machine in + *-be) + os=-beos + ;; ++ *-haiku) ++ os=-haiku ++ ;; + *-ibm) + os=-aix + ;; ++ *-knuth) ++ os=-mmixware ++ ;; + *-wec) + os=-proelf + ;; +@@ -1535,7 +1655,7 @@ case $basic_machine in + esac + + echo $basic_machine$os +-exit 0 ++exit + + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) +--- a/readline/support/mkdirs ++++ b/readline/support/mkdirs +@@ -7,19 +7,18 @@ + + # Copyright (C) 1996-2002 Free Software Foundation, Inc. + # +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# This program is free software: you can 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. ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. + # +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . + + for dir + do +--- a/readline/support/mkdist ++++ b/readline/support/mkdist +@@ -12,19 +12,19 @@ + + # Copyright (C) 1996-2002 Free Software Foundation, Inc. + # +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# This program is free software: you can 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. ++# 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 . + # +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + + SRCDIR=src + ROOTNAME=bash +--- a/readline/support/shlib-install ++++ b/readline/support/shlib-install +@@ -3,7 +3,7 @@ + # shlib-install - install a shared library and do any necessary host-specific + # post-installation configuration (like ldconfig) + # +-# usage: shlib-install [-D] -O host_os -d installation-dir [-b bin-dir] -i install-prog [-U] library ++# usage: shlib-install [-D] -O host_os [-V host_vendor] -d installation-dir [-b bin-dir] -i install-prog [-U] library + # + # Chet Ramey + # chet@po.cwru.edu +@@ -15,13 +15,14 @@ INSTALLDIR=/usr/local/lib + LDCONFIG=ldconfig + + PROGNAME=`basename $0` +-USAGE="$PROGNAME [-D] -O host_os -d installation-dir [-b bin-dir] -i install-prog [-U] library" ++USAGE="$PROGNAME [-D] -O host_os [-V host_vendor] -d installation-dir [-b bin-dir] -i install-prog [-U] library" + + # process options + + while [ $# -gt 0 ]; do + case "$1" in + -O) shift; host_os="$1"; shift ;; ++ -V) shift; host_vendor="$1"; shift ;; + -d) shift; INSTALLDIR="$1"; shift ;; + -b) shift; BINDIR="$1" ; shift ;; + -i) shift; INSTALLPROG="$1" ; shift ;; +@@ -65,14 +66,15 @@ fi + # post-install/uninstall + + # HP-UX and Darwin/MacOS X require that a shared library have execute permission ++# Linux does, too, and ldd warns about it + # Cygwin installs both a dll (which must go in $BINDIR) and an implicit + # link library (in $libdir) + case "$host_os" in +-hpux*|darwin*|macosx*) ++hpux*|darwin*|macosx*|linux*) + if [ -z "$uninstall" ]; then + chmod 555 ${INSTALLDIR}/${LIBNAME} + fi ;; +-cygwin*) ++cygwin*|mingw*) + IMPLIBNAME=`echo ${LIBNAME} \ + | sed -e 's,^cyg,lib,' -e 's,[0-9]*.dll$,.dll.a,'` + if [ -z "$uninstall" ]; then +@@ -114,8 +116,8 @@ INSTALL_LINK2='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK2' + # + # Create symlinks to the installed library. This section is incomplete. + # +-case "$host_os" in +-*linux*) ++case "$host_os-$host_vendor" in ++*linux*|freebsd*-gentoo) + # libname.so.M -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK2 + if [ -z "$uninstall" ]; then +@@ -129,7 +131,7 @@ case "$host_os" in + fi + ;; + +-bsdi4*|*gnu*|darwin*|macosx*|k*bsd*-gnu) ++bsdi4*|*gnu*|darwin*|macosx*|netbsd*) + # libname.so.M -> libname.so.M.N + ${echo} ${RM} ${INSTALLDIR}/$LINK2 + if [ -z "$uninstall" ]; then +@@ -143,7 +145,7 @@ bsdi4*|*gnu*|darwin*|macosx*|k*bsd*-gnu) + fi + ;; + +-solaris2*|aix4.[2-9]*|osf*|irix[56]*|sysv[45]*|dgux*) ++solaris2*|aix4.[2-9]*|aix[5-9]*|osf*|irix[56]*|sysv[45]*|dgux*|interix*) + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 + if [ -z "$uninstall" ]; then +@@ -153,7 +155,7 @@ solaris2*|aix4.[2-9]*|osf*|irix[56]*|sysv[45]*|dgux*) + + + # FreeBSD 3.x and above can have either a.out or ELF shared libraries +-freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*) ++freebsd3*|freebsdaout*) + if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then + # libname.so -> libname.so.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1 +@@ -175,6 +177,14 @@ freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*) + fi + ;; + ++freebsd[4-9]*|freebsdelf*|dragonfly*) ++ # libname.so -> libname.so.M ++ ${echo} ${RM} ${INSTALLDIR}/$LINK1 ++ if [ -z "$uninstall" ]; then ++ eval $INSTALL_LINK1 ++ fi ++ ;; ++ + hpux1*) + # libname.sl -> libname.M + ${echo} ${RM} ${INSTALLDIR}/$LINK1.sl +@@ -183,7 +193,7 @@ hpux1*) + fi + ;; + +-cygwin*) ++cygwin*|mingw*) + # Links to .dlls don't work. Hence shobj-conf used DLLVERSION.dll + # instead of so.SHLIB_MAJOR.SHLIB_MINOR. The postinstall above + # took care of everything else. +old mode 100755 +new mode 100644 +--- a/readline/support/shobj-conf ++++ b/readline/support/shobj-conf +@@ -10,21 +10,23 @@ + # Chet Ramey + # chet@po.cwru.edu + +-# Copyright (C) 1996-2002 Free Software Foundation, Inc. ++# Copyright (C) 1996-2009 Free Software Foundation, Inc. + # +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. ++# This file is part of GNU Bash, the Bourne Again SHell. + # +-# 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. ++# 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 . + # +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. + + # + # defaults +@@ -62,7 +64,7 @@ while [ $# -gt 0 ]; do + esac + done + +-case "${host_os}-${SHOBJ_CC}" in ++case "${host_os}-${SHOBJ_CC}-${host_vendor}" in + sunos4*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD=/usr/bin/ld +@@ -80,15 +82,17 @@ sunos4*) + ;; + + sunos5*-*gcc*|solaris2*-*gcc*) +- SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + ld_used=`gcc -print-prog-name=ld` + if ${ld_used} -V 2>&1 | grep GNU >/dev/null 2>&1; then + # This line works for the GNU ld + SHOBJ_LDFLAGS='-shared -Wl,-h,$@' ++ # http://sourceware.org/ml/binutils/2001-08/msg00361.html ++ SHOBJ_CFLAGS=-fPIC + else + # This line works for the Solaris linker in /usr/ccs/bin/ld + SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@' ++ SHOBJ_CFLAGS=-fpic + fi + + # SHLIB_XLDFLAGS='-R $(libdir)' +@@ -104,8 +108,8 @@ sunos5*|solaris2*) + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +-# All versions of Linux or the semi-mythical GNU Hurd. +-linux*-*|gnu*-*|k*bsd*-gnu-*) ++# All versions of Linux (including Gentoo/FreeBSD) or the semi-mythical GNU Hurd. ++linux*-*|gnu*-*|k*bsd*-gnu-*|freebsd*-gentoo) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' +@@ -114,7 +118,7 @@ linux*-*|gnu*-*|k*bsd*-gnu-*) + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +-freebsd2* | netbsd*) ++freebsd2*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-x -Bshareable' +@@ -124,8 +128,8 @@ freebsd2* | netbsd*) + ;; + + # FreeBSD-3.x ELF +-freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*|dragonfly*) +- SHOBJ_CFLAGS=-fpic ++freebsd3*|freebsdaout*) ++ SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + + if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then +@@ -141,7 +145,35 @@ freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*|dragonfly*) + fi + ;; + ++# FreeBSD-4.x and later have only ELF ++freebsd[4-9]*|freebsdelf*|dragonfly*) ++ SHOBJ_CFLAGS=-fPIC ++ SHOBJ_LD='${CC}' ++ ++ SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' ++ SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' ++ ++ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' ++ ;; ++ + # Darwin/MacOS X ++darwin[89]*|darwin10*) ++ SHOBJ_STATUS=supported ++ SHLIB_STATUS=supported ++ ++ SHOBJ_CFLAGS='-fno-common' ++ ++ SHOBJ_LD='MACOSX_DEPLOYMENT_TARGET=10.3 ${CC}' ++ ++ SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' ++ SHLIB_LIBSUFF='dylib' ++ ++ SHOBJ_LDFLAGS='-dynamiclib -dynamic -undefined dynamic_lookup -arch_only `/usr/bin/arch`' ++ SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' ++ ++ SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 ++ ;; ++ + darwin*|macosx*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=supported +@@ -154,7 +186,7 @@ darwin*|macosx*) + SHLIB_LIBSUFF='dylib' + + case "${host_os}" in +- darwin[78]*) SHOBJ_LDFLAGS='' ++ darwin[789]*|darwin10*) SHOBJ_LDFLAGS='' + SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' + ;; + *) SHOBJ_LDFLAGS='-dynamic' +@@ -165,7 +197,7 @@ darwin*|macosx*) + SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 + ;; + +-openbsd*) ++openbsd*|netbsd*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' +@@ -230,7 +262,7 @@ osf*) + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +-aix4.[2-9]*-*gcc*) # lightly tested by jik@cisco.com ++aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*) # lightly tested by jik@cisco.com + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='ld' + SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' +@@ -241,7 +273,7 @@ aix4.[2-9]*-*gcc*) # lightly tested by jik@cisco.com + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +-aix4.[2-9]*) ++aix4.[2-9]*|aix[5-9].*) + SHOBJ_CFLAGS=-K + SHOBJ_LD='ld' + SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' +@@ -312,7 +344,7 @@ hpux10*-*gcc*) + SHOBJ_LD='${CC}' + # if you have problems linking here, moving the `-Wl,+h,$@' from + # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work +- SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' ++ SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s' + + SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' +@@ -472,20 +504,37 @@ msdos*) + + cygwin*) + SHOBJ_LD='$(CC)' +- SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' +- SHLIB_LIBPREF='cyg' +- SHLIB_LIBSUFF='dll' +- SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' +- SHLIB_LIBS='$(TERMCAP_LIB)' ++ SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' ++ SHLIB_LIBPREF='cyg' ++ SHLIB_LIBSUFF='dll' ++ SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' ++ SHLIB_LIBS='$(TERMCAP_LIB)' + + SHLIB_DOT= +- # For official cygwin releases, DLLVERSION will be defined in the +- # environment of configure, and will be incremented any time the API +- # changes in a non-backwards compatible manner. Otherwise, it is just +- # SHLIB_MAJOR. +- if [ -n "$DLLVERSION" ] ; then ++ # For official cygwin releases, DLLVERSION will be defined in the ++ # environment of configure, and will be incremented any time the API ++ # changes in a non-backwards compatible manner. Otherwise, it is just ++ # SHLIB_MAJOR. ++ if [ -n "$DLLVERSION" ] ; then + SHLIB_DLLVERSION="$DLLVERSION" +- fi ++ fi ++ ;; ++ ++mingw*) ++ SHOBJ_LD='$(CC)' ++ SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' ++ SHLIB_LIBSUFF='dll' ++ SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' ++ SHLIB_LIBS='$(TERMCAP_LIB)' ++ ++ SHLIB_DOT= ++ # For official cygwin releases, DLLVERSION will be defined in the ++ # environment of configure, and will be incremented any time the API ++ # changes in a non-backwards compatible manner. Otherwise, it is just ++ # SHLIB_MAJOR. ++ if [ -n "$DLLVERSION" ] ; then ++ SHLIB_DLLVERSION="$DLLVERSION" ++ fi + ;; + + # +--- a/readline/support/wcwidth.c ++++ b/readline/support/wcwidth.c +@@ -1,21 +1,73 @@ + /* +- * This is an implementation of wcwidth() and wcswidth() as defined in +- * "The Single UNIX Specification, Version 2, The Open Group, 1997" +- * ++ * This is an implementation of wcwidth() and wcswidth() (defined in ++ * IEEE Std 1002.1-2001) for Unicode. + * +- * Markus Kuhn -- 2001-09-08 -- public domain ++ * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html ++ * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html ++ * ++ * In fixed-width output devices, Latin characters all occupy a single ++ * "cell" position of equal width, whereas ideographic CJK characters ++ * occupy two such cells. Interoperability between terminal-line ++ * applications and (teletype-style) character terminals using the ++ * UTF-8 encoding requires agreement on which character should advance ++ * the cursor by how many cell positions. No established formal ++ * standards exist at present on which Unicode character shall occupy ++ * how many cell positions on character terminals. These routines are ++ * a first attempt of defining such behavior based on simple rules ++ * applied to data provided by the Unicode Consortium. ++ * ++ * For some graphical characters, the Unicode standard explicitly ++ * defines a character-cell width via the definition of the East Asian ++ * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. ++ * In all these cases, there is no ambiguity about which width a ++ * terminal shall use. For characters in the East Asian Ambiguous (A) ++ * class, the width choice depends purely on a preference of backward ++ * compatibility with either historic CJK or Western practice. ++ * Choosing single-width for these characters is easy to justify as ++ * the appropriate long-term solution, as the CJK practice of ++ * displaying these characters as double-width comes from historic ++ * implementation simplicity (8-bit encoded characters were displayed ++ * single-width and 16-bit ones double-width, even for Greek, ++ * Cyrillic, etc.) and not any typographic considerations. ++ * ++ * Much less clear is the choice of width for the Not East Asian ++ * (Neutral) class. Existing practice does not dictate a width for any ++ * of these characters. It would nevertheless make sense ++ * typographically to allocate two character cells to characters such ++ * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be ++ * represented adequately with a single-width glyph. The following ++ * routines at present merely assign a single-cell width to all ++ * neutral characters, in the interest of simplicity. This is not ++ * entirely satisfactory and should be reconsidered before ++ * establishing a formal standard in this area. At the moment, the ++ * decision which Not East Asian (Neutral) characters should be ++ * represented by double-width glyphs cannot yet be answered by ++ * applying a simple rule from the Unicode database content. Setting ++ * up a proper standard for the behavior of UTF-8 character terminals ++ * will require a careful analysis not only of each Unicode character, ++ * but also of each presentation form, something the author of these ++ * routines has avoided to do so far. ++ * ++ * http://www.unicode.org/unicode/reports/tr11/ ++ * ++ * Markus Kuhn -- 2007-05-26 (Unicode 5.0) ++ * ++ * Permission to use, copy, modify, and distribute this software ++ * for any purpose and without fee is hereby granted. The author ++ * disclaims all warranties with regard to this software. ++ * ++ * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c + */ + + #ifdef __GO32__ +-/* DJGPP needs to include this before including wchar.h. */ +-# include ++# include + #endif + + #include + + struct interval { +- unsigned short first; +- unsigned short last; ++ int first; ++ int last; + }; + + /* auxiliary function for binary search in interval table */ +@@ -39,7 +91,7 @@ static int bisearch(wchar_t ucs, const struct interval *table, int max) { + } + + +-/* The following functions define the column width of an ISO 10646 ++/* The following two functions define the column width of an ISO 10646 + * character as follows: + * + * - The null character (U+0000) has a column width of 0. +@@ -51,6 +103,8 @@ static int bisearch(wchar_t ucs, const struct interval *table, int max) { + * category code Mn or Me in the Unicode database) have a + * column width of 0. + * ++ * - SOFT HYPHEN (U+00AD) has a column width of 1. ++ * + * - Other format characters (general category code Cf in the Unicode + * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. + * +@@ -58,7 +112,7 @@ static int bisearch(wchar_t ucs, const struct interval *table, int max) { + * have a column width of 0. + * + * - Spacing characters in the East Asian Wide (W) or East Asian +- * FullWidth (F) category as defined in Unicode Technical ++ * Full-width (F) category as defined in Unicode Technical + * Report #11 have a column width of 2. + * + * - All remaining characters (including all printable +@@ -69,44 +123,59 @@ static int bisearch(wchar_t ucs, const struct interval *table, int max) { + * in ISO 10646. + */ + +-int wcwidth(wchar_t ucs) ++int mk_wcwidth(wchar_t ucs) + { + /* sorted list of non-overlapping intervals of non-spacing characters */ ++ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ + static const struct interval combining[] = { +- { 0x0300, 0x034E }, { 0x0360, 0x0362 }, { 0x0483, 0x0486 }, +- { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 }, +- { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, +- { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 }, ++ { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, ++ { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, ++ { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, ++ { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, + { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, + { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, +- { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, +- { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, +- { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, +- { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, +- { 0x0A02, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, +- { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, +- { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, +- { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0B01, 0x0B01 }, +- { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, +- { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, +- { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, +- { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, ++ { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, ++ { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, ++ { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, ++ { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, ++ { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, ++ { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, ++ { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, ++ { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, ++ { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, ++ { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, ++ { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, ++ { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, ++ { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, + { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, +- { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, +- { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, +- { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, +- { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, +- { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, +- { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, +- { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, +- { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, +- { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, +- { 0x1160, 0x11FF }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, +- { 0x17C9, 0x17D3 }, { 0x180B, 0x180E }, { 0x18A9, 0x18A9 }, +- { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x206A, 0x206F }, +- { 0x20D0, 0x20E3 }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, +- { 0xFB1E, 0xFB1E }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, +- { 0xFFF9, 0xFFFB } ++ { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, ++ { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, ++ { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, ++ { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, ++ { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, ++ { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, ++ { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, ++ { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, ++ { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, ++ { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, ++ { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, ++ { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, ++ { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, ++ { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, ++ { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, ++ { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, ++ { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, ++ { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, ++ { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, ++ { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, ++ { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, ++ { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, ++ { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, ++ { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, ++ { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 }, ++ { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, ++ { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, ++ { 0xE0100, 0xE01EF } + }; + + /* test for 8-bit control characters */ +@@ -125,23 +194,26 @@ int wcwidth(wchar_t ucs) + return 1 + + (ucs >= 0x1100 && + (ucs <= 0x115f || /* Hangul Jamo init. consonants */ +- (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && ++ ucs == 0x2329 || ucs == 0x232a || ++ (ucs >= 0x2e80 && ucs <= 0xa4cf && + ucs != 0x303f) || /* CJK ... Yi */ + (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ + (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ ++ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ + (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ +- (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ ++ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ + (ucs >= 0xffe0 && ucs <= 0xffe6) || +- (ucs >= 0x20000 && ucs <= 0x2ffff))); ++ (ucs >= 0x20000 && ucs <= 0x2fffd) || ++ (ucs >= 0x30000 && ucs <= 0x3fffd))); + } + + +-int wcswidth(const wchar_t *pwcs, size_t n) ++int mk_wcswidth(const wchar_t *pwcs, size_t n) + { + int w, width = 0; + + for (;*pwcs && n-- > 0; pwcs++) +- if ((w = wcwidth(*pwcs)) < 0) ++ if ((w = mk_wcwidth(*pwcs)) < 0) + return -1; + else + width += w; +@@ -151,20 +223,21 @@ int wcswidth(const wchar_t *pwcs, size_t n) + + + /* +- * The following function is the same as wcwidth(), except that +- * spacing characters in the East Asian Ambiguous (A) category as +- * defined in Unicode Technical Report #11 have a column width of 2. +- * This experimental variant might be useful for users of CJK legacy +- * encodings who want to migrate to UCS. It is not otherwise +- * recommended for general use. ++ * The following functions are the same as mk_wcwidth() and ++ * mk_wcswidth(), except that spacing characters in the East Asian ++ * Ambiguous (A) category as defined in Unicode Technical Report #11 ++ * have a column width of 2. This variant might be useful for users of ++ * CJK legacy encodings who want to migrate to UCS without changing ++ * the traditional terminal character-width behaviour. It is not ++ * otherwise recommended for general use. + */ +-static int wcwidth_cjk(wchar_t ucs) ++int mk_wcwidth_cjk(wchar_t ucs) + { + /* sorted list of non-overlapping intervals of East Asian Ambiguous +- * characters */ ++ * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ + static const struct interval ambiguous[] = { + { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, +- { 0x00AA, 0x00AA }, { 0x00AD, 0x00AE }, { 0x00B0, 0x00B4 }, ++ { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, + { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, + { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, + { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, +@@ -180,42 +253,41 @@ static int wcwidth_cjk(wchar_t ucs) + { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, + { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, + { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, +- { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0300, 0x034E }, +- { 0x0360, 0x0362 }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, +- { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, +- { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, +- { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D }, +- { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, { 0x2030, 0x2030 }, +- { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B }, +- { 0x203E, 0x203E }, { 0x2074, 0x2074 }, { 0x207F, 0x207F }, +- { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, { 0x2103, 0x2103 }, +- { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, { 0x2113, 0x2113 }, +- { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, +- { 0x212B, 0x212B }, { 0x2153, 0x2155 }, { 0x215B, 0x215E }, +- { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 }, +- { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, +- { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, +- { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F }, +- { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A }, +- { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, +- { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 }, +- { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C }, +- { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, +- { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 }, +- { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, +- { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, +- { 0x2329, 0x232A }, { 0x2460, 0x24BF }, { 0x24D0, 0x24E9 }, +- { 0x2500, 0x254B }, { 0x2550, 0x2574 }, { 0x2580, 0x258F }, +- { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, +- { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, +- { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, +- { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, +- { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, ++ { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, ++ { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, ++ { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, ++ { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, ++ { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, ++ { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, ++ { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, ++ { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, ++ { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, ++ { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, ++ { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, ++ { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, ++ { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, ++ { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, ++ { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, ++ { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, ++ { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, ++ { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E }, ++ { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 }, ++ { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, ++ { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F }, ++ { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, ++ { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, ++ { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B }, ++ { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 }, ++ { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, ++ { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, ++ { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, ++ { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, ++ { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 }, + { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, + { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, + { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, +- { 0x273D, 0x273D }, { 0x3008, 0x300B }, { 0x3014, 0x3015 }, +- { 0x3018, 0x301B }, { 0xFFFD, 0xFFFD } ++ { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF }, ++ { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD } + }; + + /* binary search in table of non-spacing characters */ +@@ -223,16 +295,16 @@ static int wcwidth_cjk(wchar_t ucs) + sizeof(ambiguous) / sizeof(struct interval) - 1)) + return 2; + +- return wcwidth(ucs); ++ return mk_wcwidth(ucs); + } + + +-int wcswidth_cjk(const wchar_t *pwcs, size_t n) ++int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) + { + int w, width = 0; + + for (;*pwcs && n-- > 0; pwcs++) +- if ((w = wcwidth_cjk(*pwcs)) < 0) ++ if ((w = mk_wcwidth_cjk(*pwcs)) < 0) + return -1; + else + width += w; +--- a/readline/tcap.h ++++ b/readline/tcap.h +@@ -1,25 +1,23 @@ + /* tcap.h -- termcap library functions and variables. */ + +-/* Copyright (C) 1996 Free Software Foundation, Inc. ++/* Copyright (C) 1996-2009 Free Software Foundation, Inc. + +- This file contains the Readline Library (the Library), a set of +- routines for providing Emacs style line input to programs that ask +- for it. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_RLTCAP_H_) + #define _RLTCAP_H_ +--- a/readline/terminal.c ++++ b/readline/terminal.c +@@ -1,24 +1,24 @@ + /* terminal.c -- controlling the terminal with termcap. */ + +-/* Copyright (C) 1996-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1996-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -71,6 +71,17 @@ + #include "xmalloc.h" + + #if defined (__MINGW32__) ++# include ++# include ++ ++static void _win_get_screensize PARAMS((int *, int *)); ++#endif ++ ++#if defined (__EMX__) ++static void _emx_get_screensize PARAMS((int *, int *)); ++#endif ++ ++#if defined (__MINGW32__) + # include + # include + #endif +@@ -78,7 +89,10 @@ + #define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay) + #define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc) + +-int rl_prefer_env_winsize; ++/* If the calling application sets this to a non-zero value, readline will ++ use the $LINES and $COLUMNS environment variables to set its idea of the ++ window size before interrogating the kernel. */ ++int rl_prefer_env_winsize = 0; + + /* **************************************************************** */ + /* */ +@@ -93,12 +107,12 @@ static char *term_string_buffer = (char *)NULL; + + static int tcap_initialized; + +-#if !defined (__linux__) ++#if !defined (__linux__) && !defined (NCURSES_VERSION) + # if defined (__EMX__) || defined (NEED_EXTERN_PC) + extern + # endif /* __EMX__ || NEED_EXTERN_PC */ + char PC, *BC, *UP; +-#endif /* __linux__ */ ++#endif /* !__linux__ && !NCURSES_VERSION */ + + /* Some strings to control terminal actions. These are output by tputs (). */ + char *_rl_term_clreol; +@@ -122,9 +136,7 @@ char *_rl_term_IC; + char *_rl_term_dc; + char *_rl_term_DC; + +-#if defined (HACK_TERMCAP_MOTION) + char *_rl_term_forward_char; +-#endif /* HACK_TERMCAP_MOTION */ + + /* How to go up a line. */ + char *_rl_term_up; +@@ -195,6 +207,26 @@ _emx_get_screensize (swp, shp) + } + #endif + ++#if defined (__MINGW32__) ++static void ++_win_get_screensize (swp, shp) ++ int *swp, *shp; ++{ ++ HANDLE hConOut; ++ CONSOLE_SCREEN_BUFFER_INFO scr; ++ ++ hConOut = GetStdHandle (STD_OUTPUT_HANDLE); ++ if (hConOut != INVALID_HANDLE_VALUE) ++ { ++ if (GetConsoleScreenBufferInfo (hConOut, &scr)) ++ { ++ *swp = scr.dwSize.X; ++ *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1; ++ } ++ } ++} ++#endif ++ + /* Get readline's idea of the screen size. TTY is a file descriptor open + to the terminal. If IGNORE_ENV is true, we do not pay attention to the + values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being +@@ -233,7 +265,9 @@ _rl_get_screen_size (tty, ignore_env) + #endif + + #if defined (__EMX__) +- _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); ++ _emx_get_screensize (&wc, &wr); ++#elif defined (__MINGW32__) ++ _win_get_screensize (&wc, &wr); + #endif + + if (ignore_env || rl_prefer_env_winsize == 0) +@@ -347,24 +381,24 @@ rl_reset_screen_size () + void + rl_resize_terminal () + { +- if (readline_echoing_p) ++ _rl_get_screen_size (fileno (rl_instream), 1); ++ if (_rl_echoing_p) + { +- _rl_get_screen_size (fileno (rl_instream), 1); + if (CUSTOM_REDISPLAY_FUNC ()) + rl_forced_update_display (); +- else ++ else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0) + _rl_redisplay_after_sigwinch (); + } + } + + struct _tc_string { +- const char *tc_var; ++ const char * const tc_var; + char **tc_value; + }; + + /* This should be kept sorted, just in case we decide to change the + search algorithm to something smarter. */ +-static struct _tc_string tc_strings[] = ++static const struct _tc_string tc_strings[] = + { + { "@7", &_rl_term_at7 }, + { "DC", &_rl_term_DC }, +@@ -389,9 +423,7 @@ static struct _tc_string tc_strings[] = + { "le", &_rl_term_backspace }, + { "mm", &_rl_term_mm }, + { "mo", &_rl_term_mo }, +-#if defined (HACK_TERMCAP_MOTION) + { "nd", &_rl_term_forward_char }, +-#endif + { "pc", &_rl_term_pc }, + { "up", &_rl_term_up }, + { "vb", &_rl_visible_bell }, +@@ -505,9 +537,7 @@ _rl_init_terminal_io (terminal_name) + _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL; + _rl_term_mm = _rl_term_mo = (char *)NULL; + _rl_term_ve = _rl_term_vs = (char *)NULL; +-#if defined (HACK_TERMCAP_MOTION) +- term_forward_char = (char *)NULL; +-#endif ++ _rl_term_forward_char = (char *)NULL; + _rl_terminal_can_insert = term_has_meta = 0; + + /* Reasonable defaults for tgoto(). Readline currently only uses +@@ -546,8 +576,8 @@ _rl_init_terminal_io (terminal_name) + + /* Check to see if this terminal has a meta key and clear the capability + variables if there is none. */ +- term_has_meta = (tgetflag ("km") || tgetflag ("MT")); +- if (!term_has_meta) ++ term_has_meta = tgetflag ("km") != 0; ++ if (term_has_meta == 0) + _rl_term_mm = _rl_term_mo = (char *)NULL; + + #endif /* !__MSDOS__ */ +@@ -663,10 +693,10 @@ _rl_backspace (count) + int + rl_crlf () + { +-#if defined (NEW_TTY_DRIVER) ++#if defined (NEW_TTY_DRIVER) || defined (__MINT__) + if (_rl_term_cr) + tputs (_rl_term_cr, 1, _rl_output_character_function); +-#endif /* NEW_TTY_DRIVER */ ++#endif /* NEW_TTY_DRIVER || __MINT__ */ + putc ('\n', _rl_out_stream); + return 0; + } +@@ -675,7 +705,7 @@ rl_crlf () + int + rl_ding () + { +- if (readline_echoing_p) ++ if (_rl_echoing_p) + { + switch (_rl_bell_preference) + { +--- a/readline/text.c ++++ b/readline/text.c +@@ -1,24 +1,24 @@ + /* text.c -- text handling commands for readline. */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2010 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -67,6 +67,10 @@ static int _rl_insert_next_callback PARAMS((_rl_callback_generic_arg *)); + static int _rl_char_search_callback PARAMS((_rl_callback_generic_arg *)); + #endif + ++/* The largest chunk of text that can be inserted in one call to ++ rl_insert_text. Text blocks larger than this are divided. */ ++#define TEXT_COUNT_MAX 1024 ++ + /* **************************************************************** */ + /* */ + /* Insert and Delete */ +@@ -146,7 +150,7 @@ rl_delete_text (from, to) + if (_rl_doing_an_undo == 0) + rl_add_undo (UNDO_DELETE, from, to, text); + else +- free (text); ++ xfree (text); + + rl_end -= diff; + rl_line_buffer[rl_end] = '\0'; +@@ -185,10 +189,13 @@ _rl_replace_text (text, start, end) + { + int n; + ++ n = 0; + rl_begin_undo_group (); +- rl_delete_text (start, end + 1); ++ if (start <= end) ++ rl_delete_text (start, end + 1); + rl_point = start; +- n = rl_insert_text (text); ++ if (*text) ++ n = rl_insert_text (text); + rl_end_undo_group (); + + return n; +@@ -258,11 +265,13 @@ rl_forward_byte (count, key) + + if (count > 0) + { +- int end = rl_point + count; ++ int end, lend; ++ ++ end = rl_point + count; + #if defined (VI_MODE) +- int lend = rl_end > 0 ? rl_end - (rl_editing_mode == vi_mode) : rl_end; ++ lend = rl_end > 0 ? rl_end - (VI_COMMAND_MODE()) : rl_end; + #else +- int lend = rl_end; ++ lend = rl_end; + #endif + + if (end > lend) +@@ -280,6 +289,31 @@ rl_forward_byte (count, key) + return 0; + } + ++int ++_rl_forward_char_internal (count) ++ int count; ++{ ++ int point; ++ ++#if defined (HANDLE_MULTIBYTE) ++ point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); ++ ++#if defined (VI_MODE) ++ if (point >= rl_end && VI_COMMAND_MODE()) ++ point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO); ++#endif ++ ++ if (rl_end < 0) ++ rl_end = 0; ++#else ++ point = rl_point + count; ++ if (point > rl_end) ++ point = rl_end; ++#endif ++ ++ return (point); ++} ++ + #if defined (HANDLE_MULTIBYTE) + /* Move forward COUNT characters. */ + int +@@ -296,20 +330,18 @@ rl_forward_char (count, key) + + if (count > 0) + { +- point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO); ++ if (rl_point == rl_end && EMACS_MODE()) ++ { ++ rl_ding (); ++ return 0; ++ } + +-#if defined (VI_MODE) +- if (rl_end <= point && rl_editing_mode == vi_mode) +- point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO); +-#endif ++ point = _rl_forward_char_internal (count); + + if (rl_point == point) + rl_ding (); + + rl_point = point; +- +- if (rl_end < 0) +- rl_end = 0; + } + + return 0; +@@ -565,6 +597,21 @@ rl_clear_screen (count, key) + } + + int ++rl_skip_csi_sequence (count, key) ++ int count, key; ++{ ++ int ch; ++ ++ RL_SETSTATE (RL_STATE_MOREINPUT); ++ do ++ ch = rl_read_key (); ++ while (ch >= 0x20 && ch < 0x40); ++ RL_UNSETSTATE (RL_STATE_MOREINPUT); ++ ++ return 0; ++} ++ ++int + rl_arrow_keys (count, c) + int count, c; + { +@@ -701,7 +748,7 @@ _rl_insert_char (count, c) + + /* If we can optimize, then do it. But don't let people crash + readline because of extra large arguments. */ +- if (count > 1 && count <= 1024) ++ if (count > 1 && count <= TEXT_COUNT_MAX) + { + #if defined (HANDLE_MULTIBYTE) + string_size = count * incoming_length; +@@ -724,16 +771,16 @@ _rl_insert_char (count, c) + + string[i] = '\0'; + rl_insert_text (string); +- free (string); ++ xfree (string); + + return 0; + } + +- if (count > 1024) ++ if (count > TEXT_COUNT_MAX) + { + int decreaser; + #if defined (HANDLE_MULTIBYTE) +- string_size = incoming_length * 1024; ++ string_size = incoming_length * TEXT_COUNT_MAX; + string = (char *)xmalloc (1 + string_size); + + i = 0; +@@ -745,24 +792,24 @@ _rl_insert_char (count, c) + + while (count) + { +- decreaser = (count > 1024) ? 1024 : count; ++ decreaser = (count > TEXT_COUNT_MAX) ? TEXT_COUNT_MAX : count; + string[decreaser*incoming_length] = '\0'; + rl_insert_text (string); + count -= decreaser; + } + +- free (string); ++ xfree (string); + incoming_length = 0; + stored_count = 0; + #else /* !HANDLE_MULTIBYTE */ +- char str[1024+1]; ++ char str[TEXT_COUNT_MAX+1]; + +- for (i = 0; i < 1024; i++) ++ for (i = 0; i < TEXT_COUNT_MAX; i++) + str[i] = c; + + while (count) + { +- decreaser = (count > 1024 ? 1024 : count); ++ decreaser = (count > TEXT_COUNT_MAX ? TEXT_COUNT_MAX : count); + str[decreaser] = '\0'; + rl_insert_text (str); + count -= decreaser; +@@ -777,8 +824,9 @@ _rl_insert_char (count, c) + /* We are inserting a single character. + If there is pending input, then make a string of all of the + pending characters that are bound to rl_insert, and insert +- them all. */ +- if (_rl_any_typein ()) ++ them all. Don't do this if we're current reading input from ++ a macro. */ ++ if ((RL_ISSTATE (RL_STATE_MACROINPUT) == 0) && _rl_any_typein ()) + _rl_insert_typein (c); + else + { +@@ -857,6 +905,9 @@ _rl_insert_next (count) + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + #if defined (HANDLE_SIGNALS) + if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) + _rl_restore_tty_signals (); +@@ -940,7 +991,7 @@ rl_newline (count, key) + if (rl_erase_empty_line && rl_point == 0 && rl_end == 0) + return 0; + +- if (readline_echoing_p) ++ if (_rl_echoing_p) + _rl_update_final (); + return 0; + } +@@ -1071,6 +1122,8 @@ int + rl_delete (count, key) + int count, key; + { ++ int xpoint; ++ + if (count < 0) + return (_rl_rubout_char (-count, key)); + +@@ -1082,21 +1135,19 @@ rl_delete (count, key) + + if (count > 1 || rl_explicit_arg) + { +- int orig_point = rl_point; ++ xpoint = rl_point; + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_forward_char (count, key); + else + rl_forward_byte (count, key); + +- rl_kill_text (orig_point, rl_point); +- rl_point = orig_point; ++ rl_kill_text (xpoint, rl_point); ++ rl_point = xpoint; + } + else + { +- int new_point; +- +- new_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); +- rl_delete_text (rl_point, new_point); ++ xpoint = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO); ++ rl_delete_text (rl_point, xpoint); + } + return 0; + } +@@ -1120,7 +1171,7 @@ int + rl_delete_horizontal_space (count, ignore) + int count, ignore; + { +- int start = rl_point; ++ int start; + + while (rl_point && whitespace (rl_line_buffer[rl_point - 1])) + rl_point--; +@@ -1237,8 +1288,9 @@ rl_change_case (count, op) + #if defined (HANDLE_MULTIBYTE) + wchar_t wc, nwc; + char mb[MB_LEN_MAX+1]; +- int mblen, p; +- mbstate_t ps; ++ int mlen; ++ size_t m; ++ mbstate_t mps; + #endif + + start = rl_point; +@@ -1255,7 +1307,7 @@ rl_change_case (count, op) + SWAP (start, end); + + #if defined (HANDLE_MULTIBYTE) +- memset (&ps, 0, sizeof (mbstate_t)); ++ memset (&mps, 0, sizeof (mbstate_t)); + #endif + + /* We are going to modify some text, so let's prepare to undo it. */ +@@ -1290,15 +1342,19 @@ rl_change_case (count, op) + #if defined (HANDLE_MULTIBYTE) + else + { +- mbrtowc (&wc, rl_line_buffer + start, end - start, &ps); ++ m = mbrtowc (&wc, rl_line_buffer + start, end - start, &mps); ++ if (MB_INVALIDCH (m)) ++ wc = (wchar_t)rl_line_buffer[start]; ++ else if (MB_NULLWCH (m)) ++ wc = L'\0'; + nwc = (nop == UpCase) ? _rl_to_wupper (wc) : _rl_to_wlower (wc); + if (nwc != wc) /* just skip unchanged characters */ + { +- mblen = wcrtomb (mb, nwc, &ps); +- if (mblen > 0) +- mb[mblen] = '\0'; ++ mlen = wcrtomb (mb, nwc, &mps); ++ if (mlen > 0) ++ mb[mlen] = '\0'; + /* Assume the same width */ +- strncpy (rl_line_buffer + start, mb, mblen); ++ strncpy (rl_line_buffer + start, mb, mlen); + } + } + #endif +@@ -1371,8 +1427,8 @@ rl_transpose_words (count, key) + + /* I think that does it. */ + rl_end_undo_group (); +- free (word1); +- free (word2); ++ xfree (word1); ++ xfree (word2); + + return 0; + } +@@ -1431,7 +1487,7 @@ rl_transpose_chars (count, key) + rl_end_undo_group (); + + #if defined (HANDLE_MULTIBYTE) +- free (dummy); ++ xfree (dummy); + #endif + + return 0; +@@ -1459,6 +1515,9 @@ _rl_char_search_internal (count, dir, schar) + int prepos; + #endif + ++ if (dir == 0) ++ return -1; ++ + pos = rl_point; + inc = (dir < 0) ? -1 : 1; + while (count) +@@ -1520,6 +1579,9 @@ _rl_char_search (count, fdir, bdir) + + mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX); + ++ if (mb_len <= 0) ++ return -1; ++ + if (count < 0) + return (_rl_char_search_internal (-count, bdir, mbchar, mb_len)); + else +@@ -1536,6 +1598,9 @@ _rl_char_search (count, fdir, bdir) + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + if (count < 0) + return (_rl_char_search_internal (-count, bdir, c)); + else +--- a/readline/tilde.c ++++ b/readline/tilde.c +@@ -1,23 +1,23 @@ + /* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */ + +-/* Copyright (C) 1988,1989 Free Software Foundation, Inc. ++/* Copyright (C) 1988-2009 Free Software Foundation, Inc. + +- This file is part of GNU Readline, a library for reading lines +- of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- Readline is free software; you can redistribute it and/or modify it +- under the terms of the GNU General Public License as published by the +- Free Software Foundation; either version 2, or (at your option) any +- later version. ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- Readline is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with Readline; see the file COPYING. If not, write to the Free +- Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ along with Readline. If not, see . ++*/ + + #if defined (HAVE_CONFIG_H) + # include +@@ -236,7 +236,7 @@ tilde_expand (string) + string += end; + + expansion = tilde_expand_word (tilde_word); +- free (tilde_word); ++ xfree (tilde_word); + + len = strlen (expansion); + #ifdef __CYGWIN__ +@@ -251,7 +251,7 @@ tilde_expand (string) + strcpy (result + result_index, expansion); + result_index += len; + } +- free (expansion); ++ xfree (expansion); + } + + result[result_index] = '\0'; +@@ -377,8 +377,8 @@ tilde_expand_word (filename) + if (expansion) + { + dirname = glue_prefix_and_suffix (expansion, filename, user_len); +- free (username); +- free (expansion); ++ xfree (username); ++ xfree (expansion); + return (dirname); + } + } +@@ -401,10 +401,9 @@ tilde_expand_word (filename) + if (expansion) + { + dirname = glue_prefix_and_suffix (expansion, filename, user_len); +- free (expansion); ++ xfree (expansion); + } + } +- free (username); + /* If we don't have a failure hook, or if the failure hook did not + expand the tilde, return a copy of what we were passed. */ + if (dirname == 0) +@@ -412,10 +411,11 @@ tilde_expand_word (filename) + } + #if defined (HAVE_GETPWENT) + else +- { +- free (username); +- dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len); +- } ++ dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len); ++#endif ++ ++ xfree (username); ++#if defined (HAVE_GETPWENT) + endpwent (); + #endif + return (dirname); +--- a/readline/tilde.h ++++ b/readline/tilde.h +@@ -1,25 +1,24 @@ + /* tilde.h: Externally available variables and function in libtilde.a. */ + +-/* Copyright (C) 1992 Free Software Foundation, Inc. ++/* Copyright (C) 1992-2009 Free Software Foundation, Inc. + +- This file contains the Readline Library (the Library), a set of ++ This file contains the Readline Library (Readline), a set of + routines for providing Emacs style line input to programs that ask + for it. + +- The Library is free software; you can redistribute it and/or modify ++ Readline is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2, or (at your option) +- any later version. +- +- The Library is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. +- +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_TILDE_H_) + # define _TILDE_H_ +--- a/readline/undo.c ++++ b/readline/undo.c +@@ -1,25 +1,25 @@ + /* readline.c -- a general facility for reading lines of input + with emacs style editing and completion. */ + +-/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -50,6 +50,8 @@ + #include "rlprivate.h" + #include "xmalloc.h" + ++extern void replace_history_data PARAMS((int, histdata_t *, histdata_t *)); ++ + /* Non-zero tells rl_delete_text and rl_insert_text to not add to + the undo list. */ + int _rl_doing_an_undo = 0; +@@ -66,19 +68,35 @@ UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL; + /* */ + /* **************************************************************** */ + +-/* Remember how to undo something. Concatenate some undos if that +- seems right. */ +-void +-rl_add_undo (what, start, end, text) ++static UNDO_LIST * ++alloc_undo_entry (what, start, end, text) + enum undo_code what; + int start, end; + char *text; + { +- UNDO_LIST *temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST)); ++ UNDO_LIST *temp; ++ ++ temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST)); + temp->what = what; + temp->start = start; + temp->end = end; + temp->text = text; ++ ++ temp->next = (UNDO_LIST *)NULL; ++ return temp; ++} ++ ++/* Remember how to undo something. Concatenate some undos if that ++ seems right. */ ++void ++rl_add_undo (what, start, end, text) ++ enum undo_code what; ++ int start, end; ++ char *text; ++{ ++ UNDO_LIST *temp; ++ ++ temp = alloc_undo_entry (what, start, end, text); + temp->next = rl_undo_list; + rl_undo_list = temp; + } +@@ -87,17 +105,60 @@ rl_add_undo (what, start, end, text) + void + rl_free_undo_list () + { ++ UNDO_LIST *release, *orig_list; ++ ++ orig_list = rl_undo_list; + while (rl_undo_list) + { +- UNDO_LIST *release = rl_undo_list; ++ release = rl_undo_list; + rl_undo_list = rl_undo_list->next; + + if (release->what == UNDO_DELETE) +- free (release->text); ++ xfree (release->text); + +- free (release); ++ xfree (release); + } + rl_undo_list = (UNDO_LIST *)NULL; ++ replace_history_data (-1, (histdata_t *)orig_list, (histdata_t *)NULL); ++} ++ ++UNDO_LIST * ++_rl_copy_undo_entry (entry) ++ UNDO_LIST *entry; ++{ ++ UNDO_LIST *new; ++ ++ new = alloc_undo_entry (entry->what, entry->start, entry->end, (char *)NULL); ++ new->text = entry->text ? savestring (entry->text) : 0; ++ return new; ++} ++ ++UNDO_LIST * ++_rl_copy_undo_list (head) ++ UNDO_LIST *head; ++{ ++ UNDO_LIST *list, *new, *roving, *c; ++ ++ if (head == 0) ++ return head; ++ ++ list = head; ++ new = 0; ++ while (list) ++ { ++ c = _rl_copy_undo_entry (list); ++ if (new == 0) ++ roving = new = c; ++ else ++ { ++ roving->next = c; ++ roving = roving->next; ++ } ++ list = list->next; ++ } ++ ++ roving->next = 0; ++ return new; + } + + /* Undo the next thing in the list. Return 0 if there +@@ -113,7 +174,7 @@ rl_do_undo () + start = end = waiting_for_begin = 0; + do + { +- if (!rl_undo_list) ++ if (rl_undo_list == 0) + return (0); + + _rl_doing_an_undo = 1; +@@ -133,7 +194,7 @@ rl_do_undo () + case UNDO_DELETE: + rl_point = start; + rl_insert_text (rl_undo_list->text); +- free (rl_undo_list->text); ++ xfree (rl_undo_list->text); + break; + + /* Undoing inserts means deleting some text. */ +@@ -161,7 +222,9 @@ rl_do_undo () + + release = rl_undo_list; + rl_undo_list = rl_undo_list->next; +- free (release); ++ replace_history_data (-1, (histdata_t *)release, (histdata_t *)rl_undo_list); ++ ++ xfree (release); + } + while (waiting_for_begin); + +@@ -231,7 +294,7 @@ int + rl_revert_line (count, key) + int count, key; + { +- if (!rl_undo_list) ++ if (rl_undo_list == 0) + rl_ding (); + else + { +--- a/readline/util.c ++++ b/readline/util.c +@@ -1,24 +1,24 @@ + /* util.c -- readline utility functions */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2010 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -66,7 +66,7 @@ + in words, or 1 if it is. */ + + int _rl_allow_pathname_alphabetic_chars = 0; +-static const char *pathname_alphabetic_chars = "/-_=~.#$"; ++static const char * const pathname_alphabetic_chars = "/-_=~.#$"; + + int + rl_alphabetic (c) +@@ -81,8 +81,7 @@ rl_alphabetic (c) + + #if defined (HANDLE_MULTIBYTE) + int +-_rl_walphabetic (wc) +- wchar_t wc; ++_rl_walphabetic (wchar_t wc) + { + int c; + +@@ -109,7 +108,7 @@ _rl_abort_internal () + _rl_pop_executing_macro (); + + rl_last_func = (rl_command_func_t *)NULL; +- longjmp (readline_top_level, 1); ++ longjmp (_rl_top_level, 1); + return (0); + } + +@@ -121,6 +120,13 @@ rl_abort (count, key) + } + + int ++_rl_null_function (count, key) ++ int count, key; ++{ ++ return 0; ++} ++ ++int + rl_tty_status (count, key) + int count, key; + { +@@ -185,6 +191,7 @@ rl_tilde_expand (ignore, key) + { + homedir = tilde_expand ("~"); + _rl_replace_text (homedir, start, end); ++ xfree (homedir); + return (0); + } + else if (rl_line_buffer[start] != '~') +@@ -212,14 +219,96 @@ rl_tilde_expand (ignore, key) + strncpy (temp, rl_line_buffer + start, len); + temp[len] = '\0'; + homedir = tilde_expand (temp); +- free (temp); ++ xfree (temp); + + _rl_replace_text (homedir, start, end); ++ xfree (homedir); + } + + return (0); + } + ++#if defined (USE_VARARGS) ++void ++#if defined (PREFER_STDARG) ++_rl_ttymsg (const char *format, ...) ++#else ++_rl_ttymsg (va_alist) ++ va_dcl ++#endif ++{ ++ va_list args; ++#if defined (PREFER_VARARGS) ++ char *format; ++#endif ++ ++#if defined (PREFER_STDARG) ++ va_start (args, format); ++#else ++ va_start (args); ++ format = va_arg (args, char *); ++#endif ++ ++ fprintf (stderr, "readline: "); ++ vfprintf (stderr, format, args); ++ fprintf (stderr, "\n"); ++ fflush (stderr); ++ ++ va_end (args); ++ ++ rl_forced_update_display (); ++} ++ ++void ++#if defined (PREFER_STDARG) ++_rl_errmsg (const char *format, ...) ++#else ++_rl_errmsg (va_alist) ++ va_dcl ++#endif ++{ ++ va_list args; ++#if defined (PREFER_VARARGS) ++ char *format; ++#endif ++ ++#if defined (PREFER_STDARG) ++ va_start (args, format); ++#else ++ va_start (args); ++ format = va_arg (args, char *); ++#endif ++ ++ fprintf (stderr, "readline: "); ++ vfprintf (stderr, format, args); ++ fprintf (stderr, "\n"); ++ fflush (stderr); ++ ++ va_end (args); ++} ++ ++#else /* !USE_VARARGS */ ++void ++_rl_ttymsg (format, arg1, arg2) ++ char *format; ++{ ++ fprintf (stderr, "readline: "); ++ fprintf (stderr, format, arg1, arg2); ++ fprintf (stderr, "\n"); ++ ++ rl_forced_update_display (); ++} ++ ++void ++_rl_errmsg (format, arg1, arg2) ++ char *format; ++{ ++ fprintf (stderr, "readline: "); ++ fprintf (stderr, format, arg1, arg2); ++ fprintf (stderr, "\n"); ++} ++#endif /* !USE_VARARGS */ ++ + /* **************************************************************** */ + /* */ + /* String Utility Functions */ +@@ -277,41 +366,56 @@ _rl_strpbrk (string1, string2) + + #if !defined (HAVE_STRCASECMP) + /* Compare at most COUNT characters from string1 to string2. Case +- doesn't matter. */ ++ doesn't matter (strncasecmp). */ + int + _rl_strnicmp (string1, string2, count) + char *string1, *string2; + int count; + { +- register char ch1, ch2; ++ register char *s1, *s2; ++ int d; + +- while (count) ++ if (count <= 0 || (string1 == string2)) ++ return 0; ++ ++ s1 = string1; ++ s2 = string2; ++ do + { +- ch1 = *string1++; +- ch2 = *string2++; +- if (_rl_to_upper(ch1) == _rl_to_upper(ch2)) +- count--; +- else ++ d = _rl_to_lower (*s1) - _rl_to_lower (*s2); /* XXX - cast to unsigned char? */ ++ if (d != 0) ++ return d; ++ if (*s1++ == '\0') + break; ++ s2++; + } +- return (count); ++ while (--count != 0) ++ ++ return (0); + } + +-/* strcmp (), but caseless. */ ++/* strcmp (), but caseless (strcasecmp). */ + int + _rl_stricmp (string1, string2) + char *string1, *string2; + { +- register char ch1, ch2; ++ register char *s1, *s2; ++ int d; ++ ++ s1 = string1; ++ s2 = string2; + +- while (*string1 && *string2) ++ if (s1 == s2) ++ return 0; ++ ++ while ((d = _rl_to_lower (*s1) - _rl_to_lower (*s2)) == 0) + { +- ch1 = *string1++; +- ch2 = *string2++; +- if (_rl_to_upper(ch1) != _rl_to_upper(ch2)) +- return (1); ++ if (*s1++ == '\0') ++ return 0; ++ s2++; + } +- return (*string1 - *string2); ++ ++ return (d); + } + #endif /* !HAVE_STRCASECMP */ + +@@ -344,6 +448,16 @@ FUNCTION_FOR_MACRO (_rl_to_lower) + FUNCTION_FOR_MACRO (_rl_to_upper) + FUNCTION_FOR_MACRO (_rl_uppercase_p) + ++/* A convenience function, to force memory deallocation to be performed ++ by readline. DLLs on Windows apparently require this. */ ++void ++rl_free (mem) ++ void *mem; ++{ ++ if (mem) ++ free (mem); ++} ++ + /* Backwards compatibility, now that savestring has been removed from + all `public' readline header files. */ + #undef _rl_savestring +@@ -353,3 +467,60 @@ _rl_savestring (s) + { + return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s))); + } ++ ++#if defined (USE_VARARGS) ++static FILE *_rl_tracefp; ++ ++void ++#if defined (PREFER_STDARG) ++_rl_trace (const char *format, ...) ++#else ++_rl_trace (va_alist) ++ va_dcl ++#endif ++{ ++ va_list args; ++#if defined (PREFER_VARARGS) ++ char *format; ++#endif ++ ++#if defined (PREFER_STDARG) ++ va_start (args, format); ++#else ++ va_start (args); ++ format = va_arg (args, char *); ++#endif ++ ++ if (_rl_tracefp == 0) ++ _rl_tropen (); ++ vfprintf (_rl_tracefp, format, args); ++ fprintf (_rl_tracefp, "\n"); ++ fflush (_rl_tracefp); ++ ++ va_end (args); ++} ++ ++int ++_rl_tropen () ++{ ++ char fnbuf[128]; ++ ++ if (_rl_tracefp) ++ fclose (_rl_tracefp); ++ sprintf (fnbuf, "/var/tmp/rltrace.%ld", getpid()); ++ unlink(fnbuf); ++ _rl_tracefp = fopen (fnbuf, "w+"); ++ return _rl_tracefp != 0; ++} ++ ++int ++_rl_trclose () ++{ ++ int r; ++ ++ r = fclose (_rl_tracefp); ++ _rl_tracefp = 0; ++ return r; ++} ++ ++#endif +--- a/readline/vi_keymap.c ++++ b/readline/vi_keymap.c +@@ -1,24 +1,23 @@ + /* vi_keymap.c -- the keymap for vi_mode in readline (). */ + +-/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (BUFSIZ) + #include +@@ -151,7 +150,7 @@ KEYMAP_ENTRY_ARRAY vi_movement_keymap = { + { ISFUNC, rl_vi_char_search }, /* f */ + { ISFUNC, (rl_command_func_t *)0x0 }, /* g */ + { ISFUNC, rl_backward_char }, /* h */ +- { ISFUNC, rl_vi_insertion_mode }, /* i */ ++ { ISFUNC, rl_vi_insert_mode }, /* i */ + { ISFUNC, rl_get_next_history }, /* j */ + { ISFUNC, rl_get_previous_history }, /* k */ + { ISFUNC, rl_forward_char }, /* l */ +@@ -327,9 +326,9 @@ KEYMAP_ENTRY_ARRAY vi_insertion_keymap = { + { ISFUNC, rl_insert }, /* Control-k */ + { ISFUNC, rl_insert }, /* Control-l */ + { ISFUNC, rl_newline }, /* Control-m */ +- { ISFUNC, rl_insert }, /* Control-n */ ++ { ISFUNC, rl_menu_complete}, /* Control-n */ + { ISFUNC, rl_insert }, /* Control-o */ +- { ISFUNC, rl_insert }, /* Control-p */ ++ { ISFUNC, rl_backward_menu_complete }, /* Control-p */ + { ISFUNC, rl_insert }, /* Control-q */ + { ISFUNC, rl_reverse_search_history }, /* Control-r */ + { ISFUNC, rl_forward_search_history }, /* Control-s */ +--- a/readline/vi_mode.c ++++ b/readline/vi_mode.c +@@ -1,25 +1,25 @@ + /* vi_mode.c -- A vi emulation mode for Bash. + Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */ + +-/* Copyright (C) 1987-2005 Free Software Foundation, Inc. ++/* Copyright (C) 1987-2010 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + /* **************************************************************** */ +@@ -65,11 +65,13 @@ + + int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */ + ++_rl_vimotion_cxt *_rl_vimvcxt = 0; ++ + /* Non-zero means enter insertion mode. */ + static int _rl_vi_doing_insert; + + /* Command keys which do movement for xxx_to commands. */ +-static const char *vi_motion = " hl^$0ftFT;,%wbeWBE|"; ++static const char * const vi_motion = " hl^$0ftFT;,%wbeWBE|`"; + + /* Keymap used for vi replace characters. Created dynamically since + rarely used. */ +@@ -101,7 +103,7 @@ static int _rl_vi_last_key_before_insert; + static int vi_redoing; + + /* Text modification commands. These are the `redoable' commands. */ +-static const char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; ++static const char * const vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~"; + + /* Arrays for the saved marks. */ + static int vi_mark_chars['z' - 'a' + 1]; +@@ -109,12 +111,16 @@ static int vi_mark_chars['z' - 'a' + 1]; + static void _rl_vi_stuff_insert PARAMS((int)); + static void _rl_vi_save_insert PARAMS((UNDO_LIST *)); + ++static void _rl_vi_backup PARAMS((void)); ++ + static int _rl_vi_arg_dispatch PARAMS((int)); + static int rl_digit_loop1 PARAMS((void)); + + static int _rl_vi_set_mark PARAMS((void)); + static int _rl_vi_goto_mark PARAMS((void)); + ++static void _rl_vi_append_forward PARAMS((int)); ++ + static int _rl_vi_callback_getchar PARAMS((char *, int)); + + #if defined (READLINE_CALLBACKS) +@@ -124,12 +130,23 @@ static int _rl_vi_callback_change_char PARAMS((_rl_callback_generic_arg *)); + static int _rl_vi_callback_char_search PARAMS((_rl_callback_generic_arg *)); + #endif + ++static int rl_domove_read_callback PARAMS((_rl_vimotion_cxt *)); ++static int rl_domove_motion_callback PARAMS((_rl_vimotion_cxt *)); ++static int rl_vi_domove_getchar PARAMS((_rl_vimotion_cxt *)); ++ ++static int vi_change_dispatch PARAMS((_rl_vimotion_cxt *)); ++static int vi_delete_dispatch PARAMS((_rl_vimotion_cxt *)); ++static int vi_yank_dispatch PARAMS((_rl_vimotion_cxt *)); ++ ++static int vidomove_dispatch PARAMS((_rl_vimotion_cxt *)); ++ + void + _rl_vi_initialize_line () + { +- register int i; ++ register int i, n; + +- for (i = 0; i < sizeof (vi_mark_chars) / sizeof (int); i++) ++ n = sizeof (vi_mark_chars) / sizeof (vi_mark_chars[0]); ++ for (i = 0; i < n; i++) + vi_mark_chars[i] = -1; + + RL_UNSETSTATE(RL_STATE_VICMDONCE); +@@ -205,7 +222,34 @@ rl_vi_redo (count, c) + _rl_vi_stuff_insert (count); + /* And back up point over the last character inserted. */ + if (rl_point > 0) +- rl_point--; ++ _rl_vi_backup (); ++ } ++ /* Ditto for redoing an insert with `I', but move to the beginning of the ++ line like the `I' command does. */ ++ else if (_rl_vi_last_command == 'I' && vi_insert_buffer && *vi_insert_buffer) ++ { ++ rl_beg_of_line (1, 'I'); ++ _rl_vi_stuff_insert (count); ++ if (rl_point > 0) ++ _rl_vi_backup (); ++ } ++ /* Ditto for redoing an insert with `a', but move forward a character first ++ like the `a' command does. */ ++ else if (_rl_vi_last_command == 'a' && vi_insert_buffer && *vi_insert_buffer) ++ { ++ _rl_vi_append_forward ('a'); ++ _rl_vi_stuff_insert (count); ++ if (rl_point > 0) ++ _rl_vi_backup (); ++ } ++ /* Ditto for redoing an insert with `A', but move to the end of the line ++ like the `A' command does. */ ++ else if (_rl_vi_last_command == 'A' && vi_insert_buffer && *vi_insert_buffer) ++ { ++ rl_end_of_line (1, 'A'); ++ _rl_vi_stuff_insert (count); ++ if (rl_point > 0) ++ _rl_vi_backup (); + } + else + r = _rl_dispatch (_rl_vi_last_command, _rl_keymap); +@@ -571,27 +615,40 @@ rl_vi_insert_beg (count, key) + int count, key; + { + rl_beg_of_line (1, key); +- rl_vi_insertion_mode (1, key); ++ rl_vi_insert_mode (1, key); + return (0); + } + +-int +-rl_vi_append_mode (count, key) +- int count, key; ++static void ++_rl_vi_append_forward (key) ++ int key; + { ++ int point; ++ + if (rl_point < rl_end) + { + if (MB_CUR_MAX == 1 || rl_byte_oriented) + rl_point++; + else +- { +- int point = rl_point; +- rl_forward_char (1, key); +- if (point == rl_point) +- rl_point = rl_end; +- } ++ { ++ point = rl_point; ++#if 0 ++ rl_forward_char (1, key); ++#else ++ rl_point = _rl_forward_char_internal (1); ++#endif ++ if (point == rl_point) ++ rl_point = rl_end; ++ } + } +- rl_vi_insertion_mode (1, key); ++} ++ ++int ++rl_vi_append_mode (count, key) ++ int count, key; ++{ ++ _rl_vi_append_forward (key); ++ rl_vi_start_inserting (key, 1, rl_arg_sign); + return (0); + } + +@@ -625,13 +682,21 @@ rl_vi_insertion_mode (count, key) + return (0); + } + ++int ++rl_vi_insert_mode (count, key) ++ int count, key; ++{ ++ rl_vi_start_inserting (key, 1, rl_arg_sign); ++ return (0); ++} ++ + static void + _rl_vi_save_insert (up) + UNDO_LIST *up; + { + int len, start, end; + +- if (up == 0) ++ if (up == 0 || up->what != UNDO_INSERT) + { + if (vi_insert_buffer_size >= 1) + vi_insert_buffer[0] = '\0'; +@@ -668,8 +733,11 @@ _rl_vi_done_inserting () + } + else + { +- if ((_rl_vi_last_key_before_insert == 'i' || _rl_vi_last_key_before_insert == 'a') && rl_undo_list) +- _rl_vi_save_insert (rl_undo_list); ++ if (rl_undo_list && (_rl_vi_last_key_before_insert == 'i' || ++ _rl_vi_last_key_before_insert == 'a' || ++ _rl_vi_last_key_before_insert == 'I' || ++ _rl_vi_last_key_before_insert == 'A')) ++ _rl_vi_save_insert (rl_undo_list); + /* XXX - Other keys probably need to be checked. */ + else if (_rl_vi_last_key_before_insert == 'C') + rl_end_undo_group (); +@@ -716,7 +784,8 @@ _rl_vi_change_mbchar_case (count) + { + wchar_t wc; + char mb[MB_LEN_MAX+1]; +- int mblen, p; ++ int mlen, p; ++ size_t m; + mbstate_t ps; + + memset (&ps, 0, sizeof (mbstate_t)); +@@ -724,7 +793,11 @@ _rl_vi_change_mbchar_case (count) + count--; + while (count-- && rl_point < rl_end) + { +- mbrtowc (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps); ++ m = mbrtowc (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps); ++ if (MB_INVALIDCH (m)) ++ wc = (wchar_t)rl_line_buffer[rl_point]; ++ else if (MB_NULLWCH (m)) ++ wc = L'\0'; + if (iswupper (wc)) + wc = towlower (wc); + else if (iswlower (wc)) +@@ -740,9 +813,9 @@ _rl_vi_change_mbchar_case (count) + if (wc) + { + p = rl_point; +- mblen = wcrtomb (mb, wc, &ps); +- if (mblen >= 0) +- mb[mblen] = '\0'; ++ mlen = wcrtomb (mb, wc, &ps); ++ if (mlen >= 0) ++ mb[mlen] = '\0'; + rl_begin_undo_group (); + rl_vi_delete (1, 0); + if (rl_point < p) /* Did we retreat at EOL? */ +@@ -752,7 +825,7 @@ _rl_vi_change_mbchar_case (count) + rl_vi_check (); + } + else +- rl_forward_char (1, 0); ++ rl_forward_char (1, 0); + } + + return 0; +@@ -799,7 +872,7 @@ rl_vi_change_case (count, ignore) + _rl_insert_char (1, c); + rl_end_undo_group (); + rl_vi_check (); +- } ++ } + else + rl_forward_char (1, c); + } +@@ -820,6 +893,15 @@ rl_vi_put (count, key) + return (0); + } + ++static void ++_rl_vi_backup () ++{ ++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ++ rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); ++ else ++ rl_point--; ++} ++ + int + rl_vi_check () + { +@@ -828,7 +910,7 @@ rl_vi_check () + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) + rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO); + else +- rl_point--; ++ rl_point--; + } + return (0); + } +@@ -844,47 +926,106 @@ rl_vi_column (count, key) + return (0); + } + +-int +-rl_vi_domove (key, nextkey) +- int key, *nextkey; ++/* Process C as part of the current numeric argument. Return -1 if the ++ argument should be aborted, 0 if we should not read any more chars, and ++ 1 if we should continue to read chars. */ ++static int ++_rl_vi_arg_dispatch (c) ++ int c; + { +- int c, save; +- int old_end; ++ int key; + +- rl_mark = rl_point; +- RL_SETSTATE(RL_STATE_MOREINPUT); +- c = rl_read_key (); +- RL_UNSETSTATE(RL_STATE_MOREINPUT); +- *nextkey = c; ++ key = c; ++ if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument) ++ { ++ rl_numeric_arg *= 4; ++ return 1; ++ } ++ ++ c = UNMETA (c); + +- if (!member (c, vi_motion)) ++ if (_rl_digit_p (c)) + { +- if (_rl_digit_p (c)) +- { +- save = rl_numeric_arg; +- rl_numeric_arg = _rl_digit_value (c); +- rl_explicit_arg = 1; +- RL_SETSTATE (RL_STATE_NUMERICARG|RL_STATE_VIMOTION); +- rl_digit_loop1 (); +- RL_UNSETSTATE (RL_STATE_VIMOTION); +- rl_numeric_arg *= save; +- RL_SETSTATE(RL_STATE_MOREINPUT); +- c = rl_read_key (); /* real command */ +- RL_UNSETSTATE(RL_STATE_MOREINPUT); +- *nextkey = c; +- } +- else if (key == c && (key == 'd' || key == 'y' || key == 'c')) +- { +- rl_mark = rl_end; +- rl_beg_of_line (1, c); +- _rl_vi_last_motion = c; +- return (0); +- } ++ if (rl_explicit_arg) ++ rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c); + else +- return (-1); ++ rl_numeric_arg = _rl_digit_value (c); ++ rl_explicit_arg = 1; ++ return 1; /* keep going */ ++ } ++ else ++ { ++ rl_clear_message (); ++ rl_stuff_char (key); ++ return 0; /* done */ ++ } ++} ++ ++/* A simplified loop for vi. Don't dispatch key at end. ++ Don't recognize minus sign? ++ Should this do rl_save_prompt/rl_restore_prompt? */ ++static int ++rl_digit_loop1 () ++{ ++ int c, r; ++ ++ while (1) ++ { ++ if (_rl_arg_overflow ()) ++ return 1; ++ ++ c = _rl_arg_getchar (); ++ ++ r = _rl_vi_arg_dispatch (c); ++ if (r <= 0) ++ break; + } + +- _rl_vi_last_motion = c; ++ RL_UNSETSTATE(RL_STATE_NUMERICARG); ++ return (0); ++} ++ ++static void ++_rl_mvcxt_init (m, op, key) ++ _rl_vimotion_cxt *m; ++ int op, key; ++{ ++ m->op = op; ++ m->state = m->flags = 0; ++ m->ncxt = 0; ++ m->numeric_arg = -1; ++ m->start = rl_point; ++ m->end = rl_end; ++ m->key = key; ++ m->motion = -1; ++} ++ ++static _rl_vimotion_cxt * ++_rl_mvcxt_alloc (op, key) ++ int op, key; ++{ ++ _rl_vimotion_cxt *m; ++ ++ m = xmalloc (sizeof (_rl_vimotion_cxt)); ++ _rl_mvcxt_init (m, op, key); ++ return m; ++} ++ ++static void ++_rl_mvcxt_dispose (m) ++ _rl_vimotion_cxt *m; ++{ ++ xfree (m); ++} ++ ++static int ++rl_domove_motion_callback (m) ++ _rl_vimotion_cxt *m; ++{ ++ int c, save, r; ++ int old_end; ++ ++ _rl_vi_last_motion = c = m->motion; + + /* Append a blank character temporarily so that the motion routines + work right at the end of the line. */ +@@ -913,7 +1054,7 @@ rl_vi_domove (key, nextkey) + + /* If cw or cW, back up to the end of a word, so the behaviour of ce + or cE is the actual result. Brute-force, no subtlety. */ +- if (key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W')) ++ if (m->key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W')) + { + /* Don't move farther back than where we started. */ + while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point])) +@@ -922,7 +1063,7 @@ rl_vi_domove (key, nextkey) + /* Posix.2 says that if cw or cW moves the cursor towards the end of + the line, the character under the cursor should be deleted. */ + if (rl_point == rl_mark) +- rl_point++; ++ rl_point++; + else + { + /* Move past the end of the word so that the kill doesn't +@@ -936,88 +1077,142 @@ rl_vi_domove (key, nextkey) + if (rl_mark < rl_point) + SWAP (rl_point, rl_mark); + +- return (0); ++#if defined (READLINE_CALLBACKS) ++ if (RL_ISSTATE (RL_STATE_CALLBACK)) ++ (*rl_redisplay_function)(); /* make sure motion is displayed */ ++#endif ++ ++ r = vidomove_dispatch (m); ++ ++ return (r); + } + +-/* Process C as part of the current numeric argument. Return -1 if the +- argument should be aborted, 0 if we should not read any more chars, and +- 1 if we should continue to read chars. */ ++#define RL_VIMOVENUMARG() (RL_ISSTATE (RL_STATE_VIMOTION) && RL_ISSTATE (RL_STATE_NUMERICARG)) ++ + static int +-_rl_vi_arg_dispatch (c) +- int c; ++rl_domove_read_callback (m) ++ _rl_vimotion_cxt *m; + { +- int key; ++ int c, save; + +- key = c; +- if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument) ++ c = m->motion; ++ ++ if (member (c, vi_motion)) + { +- rl_numeric_arg *= 4; +- return 1; ++#if defined (READLINE_CALLBACKS) ++ /* If we just read a vi-mode motion command numeric argument, turn off ++ the `reading numeric arg' state */ ++ if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG()) ++ RL_UNSETSTATE (RL_STATE_NUMERICARG); ++#endif ++ /* Should do everything, including turning off RL_STATE_VIMOTION */ ++ return (rl_domove_motion_callback (m)); + } +- +- c = UNMETA (c); +- +- if (_rl_digit_p (c)) ++ else if (m->key == c && (m->key == 'd' || m->key == 'y' || m->key == 'c')) + { +- if (rl_explicit_arg) +- rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c); +- else +- rl_numeric_arg = _rl_digit_value (c); ++ rl_mark = rl_end; ++ rl_beg_of_line (1, c); ++ _rl_vi_last_motion = c; ++ RL_UNSETSTATE (RL_STATE_VIMOTION); ++ return (vidomove_dispatch (m)); ++ } ++#if defined (READLINE_CALLBACKS) ++ /* XXX - these need to handle rl_universal_argument bindings */ ++ /* Reading vi motion char continuing numeric argument */ ++ else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_VIMOVENUMARG()) ++ { ++ return (_rl_vi_arg_dispatch (c)); ++ } ++ /* Readine vi motion char starting numeric argument */ ++ else if (_rl_digit_p (c) && RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_VIMOTION) && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)) ++ { ++ RL_SETSTATE (RL_STATE_NUMERICARG); ++ return (_rl_vi_arg_dispatch (c)); ++ } ++#endif ++ else if (_rl_digit_p (c)) ++ { ++ /* This code path taken when not in callback mode */ ++ save = rl_numeric_arg; ++ rl_numeric_arg = _rl_digit_value (c); + rl_explicit_arg = 1; +- return 1; ++ RL_SETSTATE (RL_STATE_NUMERICARG); ++ rl_digit_loop1 (); ++ rl_numeric_arg *= save; ++ c = rl_vi_domove_getchar (m); ++ if (c < 0) ++ { ++ m->motion = 0; ++ return -1; ++ } ++ m->motion = c; ++ return (rl_domove_motion_callback (m)); + } + else + { +- rl_clear_message (); +- rl_stuff_char (key); +- return 0; ++ RL_UNSETSTATE (RL_STATE_VIMOTION); ++ RL_UNSETSTATE (RL_STATE_NUMERICARG); ++ return (1); + } + } + +-/* A simplified loop for vi. Don't dispatch key at end. +- Don't recognize minus sign? +- Should this do rl_save_prompt/rl_restore_prompt? */ + static int +-rl_digit_loop1 () ++rl_vi_domove_getchar (m) ++ _rl_vimotion_cxt *m; + { +- int c, r; ++ int c; + +- while (1) +- { +- if (_rl_arg_overflow ()) +- return 1; ++ RL_SETSTATE(RL_STATE_MOREINPUT); ++ c = rl_read_key (); ++ RL_UNSETSTATE(RL_STATE_MOREINPUT); + +- c = _rl_arg_getchar (); ++ return c; ++} + +- r = _rl_vi_arg_dispatch (c); +- if (r <= 0) +- break; +- } ++#if defined (READLINE_CALLBACKS) ++int ++_rl_vi_domove_callback (m) ++ _rl_vimotion_cxt *m; ++{ ++ int c, r; + +- RL_UNSETSTATE(RL_STATE_NUMERICARG); +- return (0); ++ m->motion = c = rl_vi_domove_getchar (m); ++ /* XXX - what to do if this returns -1? Should we return 1 for eof to ++ callback code? */ ++ r = rl_domove_read_callback (m); ++ ++ return ((r == 0) ? r : 1); /* normalize return values */ + } ++#endif + ++/* This code path taken when not in callback mode. */ + int +-rl_vi_delete_to (count, key) +- int count, key; ++rl_vi_domove (x, ignore) ++ int x, *ignore; + { +- int c; ++ int r; ++ _rl_vimotion_cxt *m; + +- if (_rl_uppercase_p (key)) +- rl_stuff_char ('$'); +- else if (vi_redoing) +- rl_stuff_char (_rl_vi_last_motion); ++ m = _rl_vimvcxt; ++ *ignore = m->motion = rl_vi_domove_getchar (m); + +- if (rl_vi_domove (key, &c)) ++ if (m->motion < 0) + { +- rl_ding (); ++ m->motion = 0; + return -1; + } + ++ return (rl_domove_read_callback (m)); ++} ++ ++static int ++vi_delete_dispatch (m) ++ _rl_vimotion_cxt *m; ++{ + /* These are the motion commands that do not require adjusting the + mark. */ +- if ((strchr (" l|h^0bB", c) == 0) && (rl_mark < rl_end)) ++ if (((strchr (" l|h^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) && ++ (rl_mark < rl_end)) + rl_mark++; + + rl_kill_text (rl_point, rl_mark); +@@ -1025,33 +1220,61 @@ rl_vi_delete_to (count, key) + } + + int +-rl_vi_change_to (count, key) ++rl_vi_delete_to (count, key) + int count, key; + { +- int c, start_pos; ++ int c, r; ++ ++ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_DELETE, key); ++ _rl_vimvcxt->start = rl_point; + ++ rl_mark = rl_point; + if (_rl_uppercase_p (key)) +- rl_stuff_char ('$'); ++ { ++ _rl_vimvcxt->motion = '$'; ++ r = rl_domove_motion_callback (_rl_vimvcxt); ++ } + else if (vi_redoing) +- rl_stuff_char (_rl_vi_last_motion); +- +- start_pos = rl_point; ++ { ++ _rl_vimvcxt->motion = _rl_vi_last_motion; ++ r = rl_domove_motion_callback (_rl_vimvcxt); ++ } ++#if defined (READLINE_CALLBACKS) ++ else if (RL_ISSTATE (RL_STATE_CALLBACK)) ++ { ++ RL_SETSTATE (RL_STATE_VIMOTION); ++ return (0); ++ } ++#endif ++ else ++ r = rl_vi_domove (key, &c); + +- if (rl_vi_domove (key, &c)) ++ if (r < 0) + { + rl_ding (); +- return -1; ++ r = -1; + } + ++ _rl_mvcxt_dispose (_rl_vimvcxt); ++ _rl_vimvcxt = 0; ++ ++ return r; ++} ++ ++static int ++vi_change_dispatch (m) ++ _rl_vimotion_cxt *m; ++{ + /* These are the motion commands that do not require adjusting the + mark. c[wW] are handled by special-case code in rl_vi_domove(), + and already leave the mark at the correct location. */ +- if ((strchr (" l|hwW^0bB", c) == 0) && (rl_mark < rl_end)) ++ if (((strchr (" l|hwW^0bBFT`", m->motion) == 0) && (rl_point >= m->start)) && ++ (rl_mark < rl_end)) + rl_mark++; + + /* The cursor never moves with c[wW]. */ +- if ((_rl_to_upper (c) == 'W') && rl_point < start_pos) +- rl_point = start_pos; ++ if ((_rl_to_upper (m->motion) == 'W') && rl_point < m->start) ++ rl_point = m->start; + + if (vi_redoing) + { +@@ -1069,49 +1292,145 @@ rl_vi_change_to (count, key) + rl_begin_undo_group (); /* to make the `u' command work */ + rl_kill_text (rl_point, rl_mark); + /* `C' does not save the text inserted for undoing or redoing. */ +- if (_rl_uppercase_p (key) == 0) +- _rl_vi_doing_insert = 1; +- rl_vi_start_inserting (key, rl_numeric_arg, rl_arg_sign); ++ if (_rl_uppercase_p (m->key) == 0) ++ _rl_vi_doing_insert = 1; ++ /* XXX -- TODO -- use m->numericarg? */ ++ rl_vi_start_inserting (m->key, rl_numeric_arg, rl_arg_sign); + } + + return (0); + } + + int +-rl_vi_yank_to (count, key) ++rl_vi_change_to (count, key) + int count, key; + { +- int c, save; ++ int c, r; ++ ++ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_CHANGE, key); ++ _rl_vimvcxt->start = rl_point; + +- save = rl_point; ++ rl_mark = rl_point; + if (_rl_uppercase_p (key)) +- rl_stuff_char ('$'); ++ { ++ _rl_vimvcxt->motion = '$'; ++ r = rl_domove_motion_callback (_rl_vimvcxt); ++ } ++ else if (vi_redoing) ++ { ++ _rl_vimvcxt->motion = _rl_vi_last_motion; ++ r = rl_domove_motion_callback (_rl_vimvcxt); ++ } ++#if defined (READLINE_CALLBACKS) ++ else if (RL_ISSTATE (RL_STATE_CALLBACK)) ++ { ++ RL_SETSTATE (RL_STATE_VIMOTION); ++ return (0); ++ } ++#endif ++ else ++ r = rl_vi_domove (key, &c); + +- if (rl_vi_domove (key, &c)) ++ if (r < 0) + { + rl_ding (); +- return -1; ++ r = -1; /* normalize return value */ + } + ++ _rl_mvcxt_dispose (_rl_vimvcxt); ++ _rl_vimvcxt = 0; ++ ++ return r; ++} ++ ++static int ++vi_yank_dispatch (m) ++ _rl_vimotion_cxt *m; ++{ + /* These are the motion commands that do not require adjusting the + mark. */ +- if ((strchr (" l|h^0%bB", c) == 0) && (rl_mark < rl_end)) ++ if (((strchr (" l|h^0%bBFT`", m->motion) == 0) && (rl_point >= m->start)) && ++ (rl_mark < rl_end)) + rl_mark++; + + rl_begin_undo_group (); + rl_kill_text (rl_point, rl_mark); + rl_end_undo_group (); + rl_do_undo (); +- rl_point = save; ++ rl_point = m->start; + + return (0); + } + + int ++rl_vi_yank_to (count, key) ++ int count, key; ++{ ++ int c, r; ++ ++ _rl_vimvcxt = _rl_mvcxt_alloc (VIM_YANK, key); ++ _rl_vimvcxt->start = rl_point; ++ ++ rl_mark = rl_point; ++ if (_rl_uppercase_p (key)) ++ { ++ _rl_vimvcxt->motion = '$'; ++ r = rl_domove_motion_callback (_rl_vimvcxt); ++ } ++#if defined (READLINE_CALLBACKS) ++ else if (RL_ISSTATE (RL_STATE_CALLBACK)) ++ { ++ RL_SETSTATE (RL_STATE_VIMOTION); ++ return (0); ++ } ++#endif ++ else ++ r = rl_vi_domove (key, &c); ++ ++ if (r < 0) ++ { ++ rl_ding (); ++ r = -1; ++ } ++ ++ _rl_mvcxt_dispose (_rl_vimvcxt); ++ _rl_vimvcxt = 0; ++ ++ return r; ++} ++ ++static int ++vidomove_dispatch (m) ++ _rl_vimotion_cxt *m; ++{ ++ int r; ++ ++ switch (m->op) ++ { ++ case VIM_DELETE: ++ r = vi_delete_dispatch (m); ++ break; ++ case VIM_CHANGE: ++ r = vi_change_dispatch (m); ++ break; ++ case VIM_YANK: ++ r = vi_yank_dispatch (m); ++ break; ++ default: ++ _rl_errmsg ("vidomove_dispatch: unknown operator %d", m->op); ++ r = 1; ++ break; ++ } ++ ++ RL_UNSETSTATE (RL_STATE_VIMOTION); ++ return r; ++} ++ ++int + rl_vi_rubout (count, key) + int count, key; + { +- int p, opoint; ++ int opoint; + + if (count < 0) + return (rl_vi_delete (-count, key)); +@@ -1193,14 +1512,22 @@ static int + _rl_vi_callback_char_search (data) + _rl_callback_generic_arg *data; + { ++ int c; + #if defined (HANDLE_MULTIBYTE) +- _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); ++ c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +- _rl_vi_last_search_char = rl_read_key (); ++ c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + #endif + ++ if (c <= 0) ++ return -1; ++ ++#if !defined (HANDLE_MULTIBYTE) ++ _rl_vi_last_search_char = c; ++#endif ++ + _rl_callback_func = 0; + _rl_want_redisplay = 1; + +@@ -1216,6 +1543,7 @@ int + rl_vi_char_search (count, key) + int count, key; + { ++ int c; + #if defined (HANDLE_MULTIBYTE) + static char *target; + static int tlen; +@@ -1224,27 +1552,38 @@ rl_vi_char_search (count, key) + #endif + + if (key == ';' || key == ',') +- _rl_cs_dir = (key == ';') ? _rl_cs_orig_dir : -_rl_cs_orig_dir; ++ { ++ if (_rl_cs_orig_dir == 0) ++ return -1; ++#if defined (HANDLE_MULTIBYTE) ++ if (_rl_vi_last_search_mblen == 0) ++ return -1; ++#else ++ if (_rl_vi_last_search_char == 0) ++ return -1; ++#endif ++ _rl_cs_dir = (key == ';') ? _rl_cs_orig_dir : -_rl_cs_orig_dir; ++ } + else + { + switch (key) +- { +- case 't': +- _rl_cs_orig_dir = _rl_cs_dir = FTO; +- break; ++ { ++ case 't': ++ _rl_cs_orig_dir = _rl_cs_dir = FTO; ++ break; + +- case 'T': +- _rl_cs_orig_dir = _rl_cs_dir = BTO; +- break; ++ case 'T': ++ _rl_cs_orig_dir = _rl_cs_dir = BTO; ++ break; + +- case 'f': +- _rl_cs_orig_dir = _rl_cs_dir = FFIND; +- break; ++ case 'f': ++ _rl_cs_orig_dir = _rl_cs_dir = FFIND; ++ break; + +- case 'F': +- _rl_cs_orig_dir = _rl_cs_dir = BFIND; +- break; +- } ++ case 'F': ++ _rl_cs_orig_dir = _rl_cs_dir = BFIND; ++ break; ++ } + + if (vi_redoing) + { +@@ -1252,21 +1591,27 @@ rl_vi_char_search (count, key) + } + #if defined (READLINE_CALLBACKS) + else if (RL_ISSTATE (RL_STATE_CALLBACK)) +- { +- _rl_callback_data = _rl_callback_data_alloc (count); +- _rl_callback_data->i1 = _rl_cs_dir; +- _rl_callback_func = _rl_vi_callback_char_search; +- return (0); +- } ++ { ++ _rl_callback_data = _rl_callback_data_alloc (count); ++ _rl_callback_data->i1 = _rl_cs_dir; ++ _rl_callback_func = _rl_vi_callback_char_search; ++ return (0); ++ } + #endif + else + { + #if defined (HANDLE_MULTIBYTE) +- _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); ++ c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); ++ if (c <= 0) ++ return -1; ++ _rl_vi_last_search_mblen = c; + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +- _rl_vi_last_search_char = rl_read_key (); ++ c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); ++ if (c < 0) ++ return -1; ++ _rl_vi_last_search_char = c; + #endif + } + } +@@ -1302,7 +1647,7 @@ rl_vi_match (ignore, key) + pre = rl_point; + rl_forward_char (1, key); + if (pre == rl_point) +- break; ++ break; + } + } + else +@@ -1331,7 +1676,7 @@ rl_vi_match (ignore, key) + { + pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY); + if (tmp == pos) +- pos--; ++ pos--; + } + if (pos >= 0) + { +@@ -1426,9 +1771,9 @@ _rl_vi_change_char (count, c, mb) + } + + static int +-_rl_vi_callback_getchar (mb, mblen) ++_rl_vi_callback_getchar (mb, mlen) + char *mb; +- int mblen; ++ int mlen; + { + int c; + +@@ -1436,9 +1781,12 @@ _rl_vi_callback_getchar (mb, mblen) + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + #if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +- c = _rl_read_mbstring (c, mb, mblen); ++ c = _rl_read_mbstring (c, mb, mlen); + #endif + + return c; +@@ -1454,6 +1802,9 @@ _rl_vi_callback_change_char (data) + + _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); + ++ if (c < 0) ++ return -1; ++ + _rl_callback_func = 0; + _rl_want_redisplay = 1; + +@@ -1485,6 +1836,9 @@ rl_vi_change_char (count, key) + else + _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); + ++ if (c < 0) ++ return -1; ++ + return (_rl_vi_change_char (count, c, mb)); + } + +@@ -1570,8 +1924,8 @@ rl_vi_replace (count, key) + vi_replace_map[NEWLINE].function = rl_newline; + + /* If the normal vi insertion keymap has ^H bound to erase, do the +- same here. Probably should remove the assignment to RUBOUT up +- there, but I don't think it will make a difference in real life. */ ++ same here. Probably should remove the assignment to RUBOUT up ++ there, but I don't think it will make a difference in real life. */ + if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC && + vi_insertion_keymap[CTRL ('H')].function == rl_rubout) + vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete; +@@ -1619,7 +1973,7 @@ _rl_vi_set_mark () + ch = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +- if (ch < 'a' || ch > 'z') ++ if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); + return -1; +@@ -1671,7 +2025,7 @@ _rl_vi_goto_mark () + rl_point = rl_mark; + return 0; + } +- else if (ch < 'a' || ch > 'z') ++ else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); + return -1; +--- /dev/null ++++ b/readline/xfree.c +@@ -0,0 +1,50 @@ ++/* xfree.c -- safe version of free that ignores attempts to free NUL */ ++ ++/* Copyright (C) 1991-2010 Free Software Foundation, Inc. ++ ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. ++ ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ ++ ++#define READLINE_LIBRARY ++ ++#if defined (HAVE_CONFIG_H) ++#include ++#endif ++ ++#if defined (HAVE_STDLIB_H) ++# include ++#else ++# include "ansi_stdlib.h" ++#endif /* HAVE_STDLIB_H */ ++ ++#include "xmalloc.h" ++ ++/* **************************************************************** */ ++/* */ ++/* Memory Deallocation. */ ++/* */ ++/* **************************************************************** */ ++ ++/* Use this as the function to call when adding unwind protects so we ++ don't need to know what free() returns. */ ++void ++xfree (string) ++ PTR_T string; ++{ ++ if (string) ++ free (string); ++} +--- a/readline/xmalloc.c ++++ b/readline/xmalloc.c +@@ -1,23 +1,24 @@ + /* xmalloc.c -- safe versions of malloc and realloc */ + +-/* Copyright (C) 1991 Free Software Foundation, Inc. ++/* Copyright (C) 1991-2009 Free Software Foundation, Inc. + +- This file is part of GNU Readline, a library for reading lines +- of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- Readline is free software; you can redistribute it and/or modify it +- under the terms of the GNU General Public License as published by the +- Free Software Foundation; either version 2, or (at your option) any +- later version. ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. + +- Readline is distributed in the hope that it will be useful, but +- WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- General Public License for more details. ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. + + You should have received a copy of the GNU General Public License +- along with Readline; see the file COPYING. If not, write to the Free +- Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ along with Readline. If not, see . ++*/ ++ + #define READLINE_LIBRARY + + #if defined (HAVE_CONFIG_H) +@@ -76,13 +77,3 @@ xrealloc (pointer, bytes) + memory_error_and_abort ("xrealloc"); + return (temp); + } +- +-/* Use this as the function to call when adding unwind protects so we +- don't need to know what free() returns. */ +-void +-xfree (string) +- PTR_T string; +-{ +- if (string) +- free (string); +-} +--- a/readline/xmalloc.h ++++ b/readline/xmalloc.h +@@ -1,24 +1,23 @@ + /* xmalloc.h -- memory allocation that aborts on errors. */ + +-/* Copyright (C) 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1999-2009 Free Software Foundation, Inc. + +- This file is part of the GNU Readline Library, a library for +- reading lines of text with interactive input and history editing. ++ This file is part of the GNU Readline Library (Readline), a library ++ for reading lines of text with interactive input and history editing. + +- The GNU Readline Library is free software; you can redistribute it +- and/or modify it under the terms of the GNU General Public License +- as published by the Free Software Foundation; either version 2, or ++ Readline is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +- The GNU Readline Library is distributed in the hope that it will be +- useful, but WITHOUT ANY WARRANTY; without even the implied warranty +- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ Readline is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +- The GNU General Public License is often shipped with GNU software, and +- is generally kept in a file called COPYING or LICENSE. If you do not +- have a copy of the license, write to the Free Software Foundation, +- 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ ++ You should have received a copy of the GNU General Public License ++ along with Readline. If not, see . ++*/ + + #if !defined (_XMALLOC_H_) + #define _XMALLOC_H_ diff --git a/gdb-bz701131-readline62-2of3.patch b/gdb-bz701131-readline62-2of3.patch new file mode 100644 index 0000000..e445bde --- /dev/null +++ b/gdb-bz701131-readline62-2of3.patch @@ -0,0 +1,231 @@ +http://sourceware.org/ml/gdb-patches/2011-05/msg00002.html +Subject: [patch] testsuite: Test readline-6.2 "ask" regression + +Hi, + +this problem does not affect default FSF GDB build as it is using bundled +readline-5.1. But with system readline-6.2 and build using: + --with-system-readline use installed readline library + +GDB will no longer ask about displaying too many symbols and dumps them all +immediately. +PASS: + $ gdb gdb + (gdb) p + Display all 21482 possibilities? (y or n)_ +FAIL: + $ gdb gdb + (gdb) p + Display all 22129 possibilities? (y or n) + ../../bfd/aout-target.h cs_to_section + ../../bfd/aout32.c ctime + + +This regression will soon start affecting distros: + FSF GDB HEAD - PASS - using bundled readline-5.1 + fedora-15 - FAIL - using system readline-6.2 + fedora-14 - PASS - using system readline-6.1 + debian-6.0 - PASS - using system readline-6.1 + kubuntu-10.10 - PASS - using system readline-6.1 + +I have asked about it on readline ml: + Re: [Bug-readline] callback mode pager disable status + https://lists.gnu.org/archive/html/bug-readline/2011-04/msg00012.html +The suggested workaround (in fact the readline-5.1 code state) going to patch +into the proposed FSF GDB bundled readline-6.2. Distros then can stop using +--with-system-readline to still feature recent and system matching readline +until readline-7.0 gets released. + +This regression has been so far caught only with system debug infos installed: + -PASS: gdb.base/completion.exp: complete (2) 'p no_var_named_this-' + -PASS: gdb.base/completion.exp: complete 'p values[0].a' + -PASS: gdb.base/completion.exp: complete 'p values[0] . a' + -PASS: gdb.base/completion.exp: complete 'p &values[0] -> a' + -PASS: gdb.base/completion.exp: copmletion of field in anonymous union + +FAIL: gdb.base/completion.exp: (timeout) complete (2) 'p no_var_named_this-' + +FAIL: gdb.base/completion.exp: (timeout) complete 'p values[0].a' 2 + +FAIL: gdb.base/completion.exp: (timeout) complete 'p values[0] . a' 2 + +FAIL: gdb.base/completion.exp: (timeout) complete 'p &values[0] -> a' 2 + +FAIL: gdb.base/completion.exp: copmletion of field in anonymous union + +I will check it in with no comments. + + +Thanks, +Jan + + +gdb/testsuite/ +2011-05-01 Jan Kratochvil + + * gdb.base/readline-ask.c: New file. + * gdb.base/readline-ask.exp: New file. + * gdb.base/readline-ask.inputrc: New file. + +--- /dev/null ++++ b/gdb/testsuite/gdb.base/readline-ask.c +@@ -0,0 +1,23 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2011 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 . */ ++ ++int ++symbol_01_length_40_____________________, ++symbol_02_length_40_____________________, ++symbol_03_length_40_____________________, ++symbol_04_length_40_____________________, ++symbol_10_length_40_____________________; +--- /dev/null ++++ b/gdb/testsuite/gdb.base/readline-ask.exp +@@ -0,0 +1,118 @@ ++# Copyright (C) 2011 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 . ++ ++set testfile readline-ask ++set executable ${testfile}.x ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${executable} ++set inputrc ${srcdir}/${subdir}/${testfile}.inputrc ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {debug}] != "" } { ++ untested ${testfile}.exp ++ return -1 ++} ++ ++# INPUTRC gets reset for the next testfile. ++setenv INPUTRC $inputrc ++clean_restart ${executable} ++ ++gdb_test_no_output "set width 50" ++gdb_test_no_output "set height 3" ++ ++set cmd "p symbol_0" ++send_gdb "$cmd\t" ++set test "bell for more message" ++gdb_test_multiple "" $test { ++ -re "$cmd\007$" { ++ pass $test ++ } ++} ++ ++send_gdb "\t" ++set test "more message for 01 and 02" ++gdb_test_multiple "" $test { ++ -re "^\r\nsymbol_01_length_40_____________________\r\nsymbol_02_length_40_____________________\r\n--More--$" { ++ pass $test ++ } ++ -re "$gdb_prompt " { ++ fail $test ++ } ++} ++ ++# There get some VT100 characters printed. ++ ++send_gdb "\r" ++set test "more message for 03" ++gdb_test_multiple "" $test { ++ -re "\rsymbol_03_length_40_____________________\r\n--More--$" { ++ pass $test ++ } ++} ++ ++# "$gdb_prompt $" will not match as $cmd gets output: $gdb_prompt p symbol_0 ++# And "$gdb_prompt p symbol_0" cannot be matched as the default "$gdb_prompt $" ++# string from gdb_test_multiple could match earlier. ++ ++send_gdb "\r" ++set test "more finish for 04" ++gdb_test_multiple "" $test { ++ -re "\rsymbol_04_length_40_____________________\r\n$gdb_prompt " { ++ pass $test ++ } ++} ++ ++gdb_test "foo" {No symbol "symbol_0foo" in current context\.} "abort more message" ++ ++set cmd "p symbol_" ++send_gdb "$cmd\t" ++set test "bell for ask message" ++gdb_test_multiple "" $test { ++ -re "$cmd\007$" { ++ pass $test ++ } ++} ++ ++send_gdb "\t" ++set test "ask message" ++gdb_test_multiple "" $test { ++ -re "^\r\nDisplay all 5 possibilities\\? \\(y or n\\)$" { ++ pass $test ++ } ++ -re "$gdb_prompt " { ++ fail $test ++ return 0 ++ } ++} ++ ++send_gdb "y" ++set test "ask message for 01 and 02" ++gdb_test_multiple "" $test { ++ -re "^\r\nsymbol_01_length_40_____________________\r\nsymbol_02_length_40_____________________\r\n--More--$" { ++ pass $test ++ } ++} ++ ++# There get some VT100 characters printed. ++# See the "$gdb_prompt " match like in "more finish for 04". ++ ++send_gdb "n" ++set test "ask message no" ++gdb_test_multiple "" $test { ++ -re "\r$gdb_prompt " { ++ pass $test ++ } ++} ++ ++gdb_test "foo" {No symbol "symbol_foo" in current context\.} "abort ask message" +--- /dev/null ++++ b/gdb/testsuite/gdb.base/readline-ask.inputrc +@@ -0,0 +1,16 @@ ++# Copyright (C) 2011 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 . ++ ++set completion-query-items 5 + diff --git a/gdb-bz701131-readline62-3of3.patch b/gdb-bz701131-readline62-3of3.patch new file mode 100644 index 0000000..41d2374 --- /dev/null +++ b/gdb-bz701131-readline62-3of3.patch @@ -0,0 +1,117 @@ +http://sourceware.org/ml/gdb-patches/2011-05/msg00010.html +Subject: [patch 4/3] readline-6.2: Substitute inc-hist.texinfo + +Hi, + +forgot the patchset had a `make doc' regression: +make: *** No rule to make target `../../../gdb/doc/../../readline/doc/inc-hist.texinfo', needed by `gdb.info'. Stop. + +There was a copy hsuser.texi -> inc-hist.texinfo before with this diff: + @@ -26,9 +26,9 @@ into another language, under the above c + @node Using History Interactively + @chapter Using History Interactively + + -@ifclear BashFeatures + -@defcodeindex bt + -@end ifclear + +@c @ifclear BashFeatures + +@c @defcodeindex bt + +@c @end ifclear + + @ifset BashFeatures + This chapter describes how to use the @sc{gnu} History Library + @@ -39,9 +39,9 @@ see the @sc{gnu} Readline Library Manual + @end ifset + @ifclear BashFeatures + This chapter describes how to use the @sc{gnu} History Library interactively, + -from a user's standpoint. It should be considered a user's guide. For + -information on using the @sc{gnu} History Library in your own programs, + -@pxref{Programming with GNU History}. + +from a user's standpoint. It should be considered a user's guide. + +For information on using the @sc{gnu} History Library in other programs, + +see the @sc{gnu} Readline Library Manual. + @end ifclear + + @ifset BashFeatures + +Used slightly alternative one with IMO better reference and I have also kept +hsuser.texi in place as readline/ in src/ is no longer a standalone readline +distribution anyway. + + +Sorry, +Jan + + +gdb/doc/ +2011-05-02 Jan Kratochvil + + * Makefile.in (GDB_DOC_SOURCE_INCLUDES): Rename inc-hist.texinfo to + hsuser.texi. + * gdb.texinfo : Rename inc-hist.texinfo inclusion and + comment to hsuser.texi. Change rluser.texi name in the comment. + +readline/doc/ +2011-05-02 Jan Kratochvil + + * hsuser.texi (Using History Interactively): Disable !BashFeatures + @defcodeindex. Make the `Programming with GNU History' reference + external. + +--- a/gdb/doc/Makefile.in ++++ b/gdb/doc/Makefile.in +@@ -117,7 +117,7 @@ GDB_DOC_SOURCE_INCLUDES = \ + $(srcdir)/gpl.texi \ + $(srcdir)/agentexpr.texi \ + $(READLINE_DIR)/rluser.texi \ +- $(READLINE_DIR)/inc-hist.texinfo ++ $(READLINE_DIR)/hsuser.texi + GDB_DOC_BUILD_INCLUDES = \ + gdb-cfg.texi \ + GDBvn.texi +--- a/gdb/doc/gdb.texinfo ++++ b/gdb/doc/gdb.texinfo +@@ -31008,13 +31008,13 @@ things without first using the debugger to find the facts. + + @c The readline documentation is distributed with the readline code + @c and consists of the two following files: +-@c rluser.texinfo +-@c inc-hist.texinfo ++@c rluser.texi ++@c hsuser.texi + @c Use -I with makeinfo to point to the appropriate directory, + @c environment var TEXINPUTS with TeX. + @ifclear SYSTEM_READLINE + @include rluser.texi +-@include inc-hist.texinfo ++@include hsuser.texi + @end ifclear + + +--- a/readline/doc/hsuser.texi ++++ b/readline/doc/hsuser.texi +@@ -26,9 +26,10 @@ into another language, under the above conditions for modified versions. + @node Using History Interactively + @chapter Using History Interactively + +-@ifclear BashFeatures +-@defcodeindex bt +-@end ifclear ++@c GDB bundling modification: ++@c @ifclear BashFeatures ++@c @defcodeindex bt ++@c @end ifclear + + @ifset BashFeatures + This chapter describes how to use the @sc{gnu} History Library +@@ -41,7 +42,8 @@ see the @sc{gnu} Readline Library Manual. + 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}. ++@c GDB bundling modification: ++@pxref{Programming with GNU History, , , history, GNU History Library}. + @end ifclear + + @ifset BashFeatures + diff --git a/gdb-readline-6.0-signal.patch b/gdb-readline-6.0-signal.patch deleted file mode 100644 index 79c36b0..0000000 --- a/gdb-readline-6.0-signal.patch +++ /dev/null @@ -1,266 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2009-11/msg00596.html -Subject: [gdb FYI-patch] callback-mode readline-6.0 regression - -Hi Chet, - -FSF GDB currently ships bundled with readline-5.2 which works fine. -But using --with-system-readline and readline-6.0-patchlevel4 has -a regression: - -readline-5.2: Run `gdb -nx -q' and type CTRL-C: -(gdb) Quit -(gdb) _ - -readline-6.0: Run `gdb -nx -q' and type CTRL-C: -(gdb) _ - = nothing happens (it gets buffered and executed later) - (It does also FAIL on gdb.gdb/selftest.exp.) - -It is because GDB waits in its own poll() mainloop and readline uses via -rl_callback_handler_install and rl_callback_handler_remove. This way the -readline internal variable _rl_interrupt_immediately remains 0 and CTRL-C gets -only stored to _rl_caught_signal but not executed. - -Seen in rl_signal_handler even if _rl_interrupt_immediately is set and -_rl_handle_signal is called then the signal is still stored to -_rl_caught_signal. In the _rl_interrupt_immediately case it should not be -stored when it was already processed. - -rl_signal_handler does `_rl_interrupt_immediately = 0;' - while I am not aware -of its meaning it breaks the nest-counting of other routines which do -`_rl_interrupt_immediately++;' and `_rl_interrupt_immediately--;' possibly -creating problematic `_rl_interrupt_immediately == -1'. - -`_rl_interrupt_immediately' is an internal variable, how it could be accessed -by a readline application? (OK, maybe it should not be used.) - -Attaching a current GDB-side patch but it must access readline internal -variable _rl_caught_signal and it is generally just a workaround. Could you -please include support for signals in this asynchronous mode in readline-6.1? -I find it would be enough to make RL_CHECK_SIGNALS public? - - -GDB: No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu. -But this is not a patch intended to be accepted. - - -Thanks, -Jan - - -gdb/ -2009-11-29 Jan Kratochvil - - * config.in, configure: Regenerate. - * configure.ac (for readline_echoing_p): Move inside $LIBS change. - (for _rl_caught_signal): New. - * event-loop.c: Include readline/readline.h. - (gdb_do_one_event) [HAVE_READLINE_CAUGHT_SIGNAL]: New. - -gdb/testsuite/ -2009-11-29 Jan Kratochvil - - * gdb.gdb/selftest.exp (backtrace through signal handler): Move before - SIGINT pass, drop the timeout case. - (send SIGINT signal to child process): Use gdb_test. - (backtrace through readline handler): New. - -Index: gdb-7.2.50.20110107/gdb/config.in -=================================================================== ---- gdb-7.2.50.20110107.orig/gdb/config.in 2011-01-17 15:36:40.000000000 +0100 -+++ gdb-7.2.50.20110107/gdb/config.in 2011-01-17 15:37:09.000000000 +0100 -@@ -464,6 +464,9 @@ - /* Define to 1 if wcwidth is declared even after undefining macros. */ - #undef HAVE_RAW_DECL_WCWIDTH - -+/* readline-6.0 workaround of blocked signals. */ -+#undef HAVE_READLINE_CAUGHT_SIGNAL -+ - /* Define to 1 if you have the `realpath' function. */ - #undef HAVE_REALPATH - -Index: gdb-7.2.50.20110107/gdb/configure.ac -=================================================================== ---- gdb-7.2.50.20110107.orig/gdb/configure.ac 2011-01-17 15:36:42.000000000 +0100 -+++ gdb-7.2.50.20110107/gdb/configure.ac 2011-01-17 15:37:09.000000000 +0100 -@@ -736,17 +736,25 @@ if test "$with_system_readline" = yes; t - # readline-6.0 started to use the name `_rl_echoing_p'. - # `$(READLINE_DIR)/' of bundled readline would not resolve in configure. - -- AC_MSG_CHECKING([for readline_echoing_p]) - save_LIBS=$LIBS - LIBS="$LIBS $READLINE" -+ AC_MSG_CHECKING([for readline_echoing_p]) - AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int readline_echoing_p; - return readline_echoing_p;]]), - [READLINE_ECHOING_P=yes], - [READLINE_ECHOING_P=no - AC_DEFINE([readline_echoing_p], [_rl_echoing_p], - [readline-6.0 started to use different name.])]) -- LIBS="$save_LIBS" - AC_MSG_RESULT([$READLINE_ECHOING_P]) -+ AC_MSG_CHECKING([for _rl_caught_signal]) -+ AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int volatile _rl_caught_signal; -+ return _rl_caught_signal;]]), -+ [READLINE_CAUGHT_SIGNAL=yes -+ AC_DEFINE([HAVE_READLINE_CAUGHT_SIGNAL],, -+ [readline-6.0 workaround of blocked signals.])], -+ [READLINE_CAUGHT_SIGNAL=no]) -+ AC_MSG_RESULT([$READLINE_CAUGHT_SIGNAL]) -+ LIBS="$save_LIBS" - else - READLINE='$(READLINE_DIR)/libreadline.a' - READLINE_DEPS='$(READLINE)' -Index: gdb-7.2.50.20110107/gdb/event-loop.c -=================================================================== ---- gdb-7.2.50.20110107.orig/gdb/event-loop.c 2011-01-05 23:22:48.000000000 +0100 -+++ gdb-7.2.50.20110107/gdb/event-loop.c 2011-01-17 15:37:23.000000000 +0100 -@@ -37,6 +37,7 @@ - #include "exceptions.h" - #include "gdb_assert.h" - #include "gdb_select.h" -+#include "readline/readline.h" - - /* Tell create_file_handler what events we are interested in. - This is used by the select version of the event loop. */ -@@ -419,6 +420,9 @@ gdb_do_one_event (void *data) - static int event_source_head = 0; - const int number_of_sources = 3; - int current = 0; -+#ifdef HAVE_READLINE_CAUGHT_SIGNAL -+ extern int volatile _rl_caught_signal; -+#endif - - /* Any events already waiting in the queue? */ - if (process_event ()) -@@ -463,6 +467,29 @@ gdb_do_one_event (void *data) - if (gdb_wait_for_event (1) < 0) - return -1; - -+#ifdef HAVE_READLINE_CAUGHT_SIGNAL -+ if (async_command_editing_p && RL_ISSTATE (RL_STATE_CALLBACK) -+ && _rl_caught_signal) -+ { -+ char *prompt; -+ -+ if (rl_prompt == NULL) -+ { -+ /* Should not happen, defensive only. */ -+ prompt = ""; -+ } -+ else -+ { -+ prompt = alloca (strlen (rl_prompt) + 1); -+ strcpy (prompt, rl_prompt); -+ } -+ -+ /* Call RL_CHECK_SIGNALS this way. */ -+ rl_callback_handler_remove (); -+ rl_callback_handler_install (prompt, input_handler); -+ } -+#endif -+ - /* Handle any new events occurred while waiting. */ - if (process_event ()) - return 1; -Index: gdb-7.2.50.20110107/gdb/testsuite/gdb.gdb/selftest.exp -=================================================================== ---- gdb-7.2.50.20110107.orig/gdb/testsuite/gdb.gdb/selftest.exp 2011-01-17 15:36:37.000000000 +0100 -+++ gdb-7.2.50.20110107/gdb/testsuite/gdb.gdb/selftest.exp 2011-01-17 15:37:09.000000000 +0100 -@@ -433,6 +433,28 @@ proc test_with_self { executable } { - } - } - -+ # get a stack trace with the poll function -+ # -+ # This fails on some linux systems for unknown reasons. On the -+ # systems where it fails, sometimes it works fine when run manually. -+ # The testsuite failures may not be limited to just aout systems. -+ setup_xfail "i*86-pc-linuxaout-gnu" -+ set description "backtrace through signal handler" -+ gdb_test_multiple "backtrace" "$description" { -+ -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" { -+ pass "$description" -+ } -+ -re ".*$gdb_prompt $" { -+ # On the alpha, we hit the infamous problem about gdb -+ # being unable to get the frame pointer (mentioned in -+ # gdb/README). As it is intermittent, there is no way to -+ # XFAIL it which will give us an XPASS if the problem goes -+ # away. -+ setup_xfail "alpha*-*-osf*" -+ fail "$description" -+ } -+ } -+ - set description "send SIGINT signal to child process" - gdb_test "signal SIGINT" \ - "Continuing with signal SIGINT.*" \ -@@ -443,10 +465,11 @@ proc test_with_self { executable } { - # This fails on some linux systems for unknown reasons. On the - # systems where it fails, sometimes it works fine when run manually. - # The testsuite failures may not be limited to just aout systems. -+ # Optional system readline may not have symbols to be shown. - setup_xfail "i*86-pc-linuxaout-gnu" -- set description "backtrace through signal handler" -+ set description "backtrace through readline handler" - gdb_test_multiple "backtrace" "$description" { -- -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" { -+ -re "#0.*gdb_do_one_event.*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" { - pass "$description" - } - -re ".*$gdb_prompt $" { -Index: gdb-7.2.50.20110107/gdb/configure -=================================================================== ---- gdb-7.2.50.20110107.orig/gdb/configure 2011-01-17 15:36:42.000000000 +0100 -+++ gdb-7.2.50.20110107/gdb/configure 2011-01-17 15:37:09.000000000 +0100 -@@ -10237,10 +10237,10 @@ if test "$with_system_readline" = yes; t - # readline-6.0 started to use the name `_rl_echoing_p'. - # `$(READLINE_DIR)/' of bundled readline would not resolve in configure. - -- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline_echoing_p" >&5 --$as_echo_n "checking for readline_echoing_p... " >&6; } - save_LIBS=$LIBS - LIBS="$LIBS $READLINE" -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline_echoing_p" >&5 -+$as_echo_n "checking for readline_echoing_p... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext - /* end confdefs.h. */ - -@@ -10263,9 +10263,35 @@ $as_echo "#define readline_echoing_p _rl - fi - rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -- LIBS="$save_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_ECHOING_P" >&5 - $as_echo "$READLINE_ECHOING_P" >&6; } -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _rl_caught_signal" >&5 -+$as_echo_n "checking for _rl_caught_signal... " >&6; } -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+extern int volatile _rl_caught_signal; -+ return _rl_caught_signal; -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ READLINE_CAUGHT_SIGNAL=yes -+ -+$as_echo "#define HAVE_READLINE_CAUGHT_SIGNAL /**/" >>confdefs.h -+ -+else -+ READLINE_CAUGHT_SIGNAL=no -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_CAUGHT_SIGNAL" >&5 -+$as_echo "$READLINE_CAUGHT_SIGNAL" >&6; } -+ LIBS="$save_LIBS" - else - READLINE='$(READLINE_DIR)/libreadline.a' - READLINE_DEPS='$(READLINE)' diff --git a/gdb.spec b/gdb.spec index e006d72..dd2f4c7 100644 --- a/gdb.spec +++ b/gdb.spec @@ -27,7 +27,7 @@ Version: 7.2.90.20110429 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 35%{?_with_upstream:.upstream}%{?dist} +Release: 36%{?_with_upstream:.upstream}%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain Group: Development/Debuggers @@ -231,8 +231,6 @@ Patch211: gdb-6.5-last-address-space-byte-test.patch Patch208: gdb-6.5-BEA-testsuite.patch # Fix readline segfault on excessively long hand-typed lines. -#=drop: After upstream's readline rebase it will be obsolete. -Patch209: gdb-6.5-readline-long-line-crash.patch #=fedoratest Patch213: gdb-6.5-readline-long-line-crash-test.patch @@ -417,9 +415,6 @@ Patch381: gdb-simultaneous-step-resume-breakpoint-test.patch #=push+work: It should be in glibc: libc-alpha: <20091004161706.GA27450@.*> Patch382: gdb-core-open-vdso-warning.patch -# Fix callback-mode readline-6.0 regression for CTRL-C (for RHEL-6.0). -Patch390: gdb-readline-6.0-signal.patch - # Fix syscall restarts for amd64->i386 biarch. #=push Patch391: gdb-x86_64-i386-syscall-restart.patch @@ -570,9 +565,15 @@ Patch589: gdb-optim-g-prologue-skip.patch # Fix physname-related CU expansion issue for C++ (PR 12708). Patch590: gdb-physname-expand-completer.patch +# Bundle readline-6.2 with a workaround of skipped "ask" (BZ 701131). +Patch591: gdb-bz701131-readline62-1of3.patch +Patch592: gdb-bz701131-readline62-2of3.patch +Patch593: gdb-bz701131-readline62-3of3.patch + BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa} -Requires: readline%{?_isa} -BuildRequires: readline-devel%{?_isa} +# --without-system-readline +# Requires: readline%{?_isa} +# BuildRequires: readline-devel%{?_isa} %if 0%{!?el5:1} # dlopen() no longer makes rpm-libs a mandatory dependency. #Requires: rpm-libs%{?_isa} @@ -758,7 +759,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch196 -p1 %patch199 -p1 %patch208 -p1 -%patch209 -p1 %patch211 -p1 %patch213 -p1 %patch214 -p1 @@ -846,15 +846,12 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch588 -p1 %patch589 -p1 %patch590 -p1 +%patch591 -p1 +%patch592 -p1 +%patch593 -p1 -%patch390 -p1 %patch393 -p1 %patch335 -p1 -readline="$(readlink -f %{_libdir}/libreadline.so)" -if [ "$readline" = "${readline%/libreadline.so.6.0}" ] -then -%patch390 -p1 -R -fi %if 0%{!?el5:1} %patch393 -p1 -R %patch335 -p1 -R @@ -932,7 +929,7 @@ CFLAGS="$CFLAGS -O0 -ggdb2" --with-separate-debug-dir=/usr/lib/debug \ --disable-sim \ --disable-rpath \ - --with-system-readline \ + --without-system-readline \ --with-expat \ $(: ppc64 host build crashes on ppc variant of libexpat.so ) \ --without-libexpat-prefix \ @@ -1274,6 +1271,11 @@ fi %{_infodir}/gdb.info* %changelog +* Mon May 2 2011 Jan Kratochvil - 7.2.90.20110429-36.fc15 +- Bundle readline-6.2 with a workaround of skipped "ask" (BZ 701131). + - Use --without-system-readline, disable Requires and BuildRequires of readline. + - Drop gdb-6.5-readline-long-line-crash.patch and gdb-readline-6.0-signal.patch. + * Fri Apr 29 2011 Jan Kratochvil - 7.2.90.20110429-35.fc15 - Rebase to FSF GDB 7.2.90.20110429 (which is a 7.3 pre-release). - Fix -O2 -g breakpoints internal error + prologue skipping (BZ 612253).