r1886 - trunk/readline

matthew at linuxfromscratch.org matthew at linuxfromscratch.org
Sun Dec 23 13:57:01 PST 2007


Author: matthew
Date: 2007-12-23 14:57:01 -0700 (Sun, 23 Dec 2007)
New Revision: 1886

Added:
   trunk/readline/readline-5.2-fixes-5.patch
Log:
Add latest upstream fixes for Readline.

Added: trunk/readline/readline-5.2-fixes-5.patch
===================================================================
--- trunk/readline/readline-5.2-fixes-5.patch	                        (rev 0)
+++ trunk/readline/readline-5.2-fixes-5.patch	2007-12-23 21:57:01 UTC (rev 1886)
@@ -0,0 +1,612 @@
+Submitted By: Matt Burgess (matthew at linuxfromscratch dot org)
+Date: 2007-12-22
+Initial Package Version: 5.2
+Upstream Status: From Upstream
+Origin: http://ftp.gnu.org/gnu/readline/readline-5.2-patches/
+Description: A combined patch containing patches 001-012 from upstream.
+
+diff -Naur readline-5.2.orig/complete.c readline-5.2/complete.c
+--- readline-5.2.orig/complete.c	2006-07-28 15:35:49.000000000 +0000
++++ readline-5.2/complete.c	2007-12-22 09:42:33.000000000 +0000
+@@ -428,7 +428,7 @@
+ 	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);
+diff -Naur readline-5.2.orig/display.c readline-5.2/display.c
+--- readline-5.2.orig/display.c	2006-09-14 18:20:12.000000000 +0000
++++ readline-5.2/display.c	2007-12-22 09:42:33.000000000 +0000
+@@ -391,14 +391,14 @@
+       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;
+@@ -561,6 +561,17 @@
+       wrap_offset = prompt_invis_chars_first_line = 0;
+     }
+ 
++#if defined (HANDLE_MULTIBYTE)
++#define CHECK_INV_LBREAKS() \
++      do { \
++	if (newlines >= (inv_lbsize - 2)) \
++	  { \
++	    inv_lbsize *= 2; \
++	    inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
++	    _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \
++	  } \
++      } while (0)
++#else
+ #define CHECK_INV_LBREAKS() \
+       do { \
+ 	if (newlines >= (inv_lbsize - 2)) \
+@@ -569,6 +580,7 @@
+ 	    inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+ 	  } \
+       } while (0)
++#endif /* HANDLE_MULTIBYTE */
+ 
+ #if defined (HANDLE_MULTIBYTE)	  
+ #define CHECK_LPOS() \
+@@ -1036,7 +1048,7 @@
+ 		tx = _rl_col_width (&visible_line[pos], 0, nleft) - 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;
+@@ -1192,7 +1204,7 @@
+      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, o_cpos;
+   int current_invis_chars;
+   int col_lendiff, col_temp;
+ #if defined (HANDLE_MULTIBYTE)
+@@ -1453,6 +1465,8 @@
+ 	_rl_last_c_pos = lendiff;
+     }
+ 
++  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. */
+@@ -1462,7 +1476,9 @@
+   /* We need to indicate that the cursor position is correct in the presence of
+      invisible characters in the prompt string.  Let's see if setting this when
+      we make sure we're at the end of the drawn prompt string works. */
+-  if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
++  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
+@@ -1506,11 +1522,31 @@
+     {
+       /* Non-zero if we're increasing the number of lines. */
+       int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
++      /* If col_lendiff is > 0, implying that the new string takes up more
++	 screen real estate than the old, but lendiff is < 0, meaning that it
++	 takes fewer bytes, we need to just output the characters starting
++	 from the first difference.  These will overwrite what is on the
++	 display, so there's no reason to do a smart update.  This can really
++	 only happen in a multibyte environment. */
++      if (lendiff < 0)
++	{
++	  _rl_output_some_chars (nfd, temp);
++	  _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
++	  /* If nfd begins before any invisible characters in the prompt,
++	     adjust _rl_last_c_pos to account for wrap_offset and set
++	     cpos_adjusted to let the caller know. */
++	  if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
++	    {
++	      _rl_last_c_pos -= wrap_offset;
++	      cpos_adjusted = 1;
++	    }
++	  return;
++	}
+       /* Sometimes it is cheaper to print the characters rather than
+ 	 use the terminal's capabilities.  If we're growing the number
+ 	 of lines, make sure we actually cause the new line to wrap
+ 	 around on auto-wrapping terminals. */
+-      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
+@@ -1533,11 +1569,16 @@
+ 	    }
+ 	  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 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;
+ 	    }
+ 	  /* Copy (new) chars to screen from first diff to last match. */
+@@ -1586,8 +1627,22 @@
+ 	  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);
++                  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. */
+@@ -1595,8 +1650,20 @@
+ 	{
+ 	  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)
+@@ -1732,7 +1799,10 @@
+   if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+     {
+       dpos = _rl_col_width (data, 0, new);
+-      if (dpos > prompt_last_invisible)		/* XXX - don't use woff here */
++      /* Use NEW when comparing against the last invisible character in the
++	 prompt string, since they're both buffer indices and DPOS is a
++	 desired display position. */
++      if (new > prompt_last_invisible)		/* XXX - don't use woff here */
+ 	{
+ 	  dpos -= woff;
+ 	  /* Since this will be assigned to _rl_last_c_pos at the end (more
+@@ -2380,6 +2450,8 @@
+ 
+   if (end <= start)
+     return 0;
++  if (MB_CUR_MAX == 1 || rl_byte_oriented)
++    return (end - start);
+ 
+   memset (&ps, 0, sizeof (mbstate_t));
+ 
+diff -Naur readline-5.2.orig/input.c readline-5.2/input.c
+--- readline-5.2.orig/input.c	2006-08-16 19:15:16.000000000 +0000
++++ readline-5.2/input.c	2007-12-22 09:42:33.000000000 +0000
+@@ -133,8 +133,11 @@
+     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 +154,7 @@
+     {
+       pop_index--;
+       if (pop_index < 0)
+-	pop_index = ibuffer_len - 1;
++	pop_index = ibuffer_len;
+       ibuffer[pop_index] = key;
+       return (1);
+     }
+@@ -250,7 +253,8 @@
+       while (chars_avail--)
+ 	{
+ 	  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;
+ 	}
+@@ -373,7 +377,11 @@
+       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;
+@@ -513,20 +521,26 @@
+      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 */
+@@ -564,7 +578,7 @@
+ 
+   c = first;
+   memset (mb, 0, mlen);
+-  for (i = 0; i < mlen; i++)
++  for (i = 0; c >= 0 && i < mlen; i++)
+     {
+       mb[i] = (char)c;
+       memset (&ps, 0, sizeof (mbstate_t));
+diff -Naur readline-5.2.orig/isearch.c readline-5.2/isearch.c
+--- readline-5.2.orig/isearch.c	2005-12-26 22:18:53.000000000 +0000
++++ readline-5.2/isearch.c	2007-12-22 09:42:33.000000000 +0000
+@@ -327,8 +327,15 @@
+   rl_command_func_t *f;
+ 
+   f = (rl_command_func_t *)NULL;
+- 
+- /* Translate the keys we do something with to opcodes. */
++
++  if (c < 0)
++    {
++      cxt->sflags |= SF_FAILED;
++      cxt->history_pos = cxt->last_found_line;
++      return -1;
++    }
++
++  /* Translate the keys we do something with to opcodes. */
+   if (c >= 0 && _rl_keymap[c].type == ISFUNC)
+     {
+       f = _rl_keymap[c].function;
+diff -Naur readline-5.2.orig/misc.c readline-5.2/misc.c
+--- readline-5.2.orig/misc.c	2005-12-26 22:20:46.000000000 +0000
++++ readline-5.2/misc.c	2007-12-22 09:42:33.000000000 +0000
+@@ -146,6 +146,8 @@
+ 	  rl_restore_prompt ();
+ 	  rl_clear_message ();
+ 	  RL_UNSETSTATE(RL_STATE_NUMERICARG);
++	  if (key < 0)
++	    return -1;
+ 	  return (_rl_dispatch (key, _rl_keymap));
+ 	}
+     }
+diff -Naur readline-5.2.orig/readline.c readline-5.2/readline.c
+--- readline-5.2.orig/readline.c	2006-08-16 19:00:36.000000000 +0000
++++ readline-5.2/readline.c	2007-12-22 09:42:33.000000000 +0000
+@@ -645,6 +645,11 @@
+   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;
+     }
+diff -Naur readline-5.2.orig/support/shobj-conf readline-5.2/support/shobj-conf
+--- readline-5.2.orig/support/shobj-conf	2006-04-11 13:15:43.000000000 +0000
++++ readline-5.2/support/shobj-conf	2007-12-22 09:42:33.000000000 +0000
+@@ -10,7 +10,7 @@
+ # Chet Ramey
+ # chet at po.cwru.edu
+ 
+-# Copyright (C) 1996-2002 Free Software Foundation, Inc.
++# Copyright (C) 1996-2007 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
+@@ -114,7 +114,7 @@
+ 	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+ 	;;
+ 
+-freebsd2* | netbsd*)
++freebsd2*)
+ 	SHOBJ_CFLAGS=-fpic
+ 	SHOBJ_LD=ld
+ 	SHOBJ_LDFLAGS='-x -Bshareable'
+@@ -125,7 +125,7 @@
+ 
+ # FreeBSD-3.x ELF
+ freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*|dragonfly*)
+-	SHOBJ_CFLAGS=-fpic
++	SHOBJ_CFLAGS=-fPIC
+ 	SHOBJ_LD='${CC}'
+ 
+ 	if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then
+@@ -142,7 +142,7 @@
+ 	;;
+ 
+ # Darwin/MacOS X
+-darwin8*)
++darwin[89]*)
+ 	SHOBJ_STATUS=supported
+ 	SHLIB_STATUS=supported
+ 	
+@@ -153,7 +153,7 @@
+ 	SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
+ 	SHLIB_LIBSUFF='dylib'
+ 
+-	SHOBJ_LDFLAGS='-undefined dynamic_lookup'
++	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 
+@@ -171,7 +171,7 @@
+ 	SHLIB_LIBSUFF='dylib'
+ 
+ 	case "${host_os}" in
+-	darwin[78]*)	SHOBJ_LDFLAGS=''
++	darwin[789]*)	SHOBJ_LDFLAGS=''
+ 			SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+ 			;;
+ 	*)		SHOBJ_LDFLAGS='-dynamic'
+@@ -182,7 +182,7 @@
+ 	SHLIB_LIBS='-lncurses'	# see if -lcurses works on MacOS X 10.1 
+ 	;;
+ 
+-openbsd*)
++openbsd*|netbsd*)
+ 	SHOBJ_CFLAGS=-fPIC
+ 	SHOBJ_LD='${CC}'
+ 	SHOBJ_LDFLAGS='-shared'
+@@ -247,7 +247,7 @@
+ 	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ 	;;
+ 
+-aix4.[2-9]*-*gcc*)		# lightly tested by jik at cisco.com
++aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*)		# lightly tested by jik at cisco.com
+ 	SHOBJ_CFLAGS=-fpic
+ 	SHOBJ_LD='ld'
+ 	SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
+@@ -258,7 +258,7 @@
+ 	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'
+@@ -329,7 +329,7 @@
+ 	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'
+diff -Naur readline-5.2.orig/text.c readline-5.2/text.c
+--- readline-5.2.orig/text.c	2006-07-28 15:55:27.000000000 +0000
++++ readline-5.2/text.c	2007-12-22 09:42:33.000000000 +0000
+@@ -857,6 +857,9 @@
+   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 ();
+@@ -1520,6 +1523,9 @@
+ 
+   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 +1542,9 @@
+   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
+diff -Naur readline-5.2.orig/vi_mode.c readline-5.2/vi_mode.c
+--- readline-5.2.orig/vi_mode.c	2006-07-29 20:42:28.000000000 +0000
++++ readline-5.2/vi_mode.c	2007-12-22 09:42:33.000000000 +0000
+@@ -886,6 +886,13 @@
+   RL_SETSTATE(RL_STATE_MOREINPUT);
+   c = rl_read_key ();
+   RL_UNSETSTATE(RL_STATE_MOREINPUT);
++
++  if (c < 0)
++    {
++      *nextkey = 0;
++      return -1;
++    }
++
+   *nextkey = c;
+ 
+   if (!member (c, vi_motion))
+@@ -902,6 +909,11 @@
+ 	  RL_SETSTATE(RL_STATE_MOREINPUT);
+ 	  c = rl_read_key ();	/* real command */
+ 	  RL_UNSETSTATE(RL_STATE_MOREINPUT);
++	  if (c < 0)
++	    {
++	      *nextkey = 0;
++	      return -1;
++	    }
+ 	  *nextkey = c;
+ 	}
+       else if (key == c && (key == 'd' || key == 'y' || key == 'c'))
+@@ -1224,14 +1236,22 @@
+ _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;
+ 
+@@ -1247,6 +1267,7 @@
+ rl_vi_char_search (count, key)
+      int count, key;
+ {
++  int c;
+ #if defined (HANDLE_MULTIBYTE)
+   static char *target;
+   static int tlen;
+@@ -1293,11 +1314,17 @@
+       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
+ 	}
+     }
+@@ -1467,6 +1494,9 @@
+   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, mlen);
+@@ -1485,6 +1515,9 @@
+ 
+   _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;
+ 
+@@ -1516,6 +1549,9 @@
+   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));
+ }
+ 
+@@ -1650,7 +1686,7 @@
+   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;
+@@ -1702,7 +1738,7 @@
+       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;




More information about the patches mailing list