Author: matthew
Date: 2008-12-06 04:02:49 -0700 (Sat, 06 Dec 2008)
New Revision: 2015

Added:
   trunk/readline/readline-5.2-fixes-6.patch
Log:
Add latest upstream Readline patches

Added: trunk/readline/readline-5.2-fixes-6.patch
===================================================================
--- trunk/readline/readline-5.2-fixes-6.patch                           (rev 0)
+++ trunk/readline/readline-5.2-fixes-6.patch   2008-12-06 11:02:49 UTC (rev 
2015)
@@ -0,0 +1,681 @@
+Submitted By:            Matt Burgess <matthew_at_linuxfromscratch_dot_org>
+Date:                    2008-12-06
+Initial Package Version: 5.2
+Upstream Status:         Already in upstream patch repo
+Origin:                  Upstream
+Description:             This patch is upstream patch numbers 1 thru 13.
+
+diff -Naur readline-5.2.orig/complete.c readline-5.2/complete.c
+--- readline-5.2.orig/complete.c       2006-07-28 16:35:49.000000000 +0100
++++ readline-5.2/complete.c    2008-12-06 11:01:20.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 19:20:12.000000000 +0100
++++ readline-5.2/display.c     2008-12-06 11:01:20.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() \
+@@ -898,6 +910,10 @@
+            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])
+@@ -932,7 +948,13 @@
+                 _rl_last_c_pos != o_cpos &&
+                 _rl_last_c_pos > wrap_offset &&
+                 o_cpos < prompt_last_invisible)
+-              _rl_last_c_pos -= wrap_offset;
++              _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
+@@ -1036,7 +1058,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 +1214,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, twidth, o_cpos;
+   int current_invis_chars;
+   int col_lendiff, col_temp;
+ #if defined (HANDLE_MULTIBYTE)
+@@ -1208,7 +1230,7 @@
+   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)
+     {
+@@ -1453,6 +1475,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 +1486,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 +1532,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 +1579,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. */
+@@ -1545,15 +1596,15 @@
+         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);
++            else
++              twidth = temp - lendiff;
++            _rl_last_c_pos += twidth;
+           }
+       }
+       else
+@@ -1586,8 +1637,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 +1660,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)
+@@ -1721,7 +1798,7 @@
+   int woff;                   /* number of invisible chars on current line */
+   int cpos, dpos;             /* current and desired cursor positions */
+ 
+-  woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
++  woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
+   cpos = _rl_last_c_pos;
+ #if defined (HANDLE_MULTIBYTE)
+   /* If we have multibyte characters, NEW is indexed by the buffer point in
+@@ -1732,7 +1809,14 @@
+   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 */
++        (prompt_physical_chars > _rl_screenwidth &&
++         _rl_last_v_pos == prompt_last_screen_line &&
++         wrap_offset != woff &&
++         new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
+       {
+         dpos -= woff;
+         /* Since this will be assigned to _rl_last_c_pos at the end (more
+@@ -2380,6 +2464,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 20:15:16.000000000 +0100
++++ readline-5.2/input.c       2008-12-06 11:01:20.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     2008-12-06 11:01:20.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        2008-12-06 11:01:20.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 20:00:36.000000000 +0100
++++ readline-5.2/readline.c    2008-12-06 11:01:20.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 14:15:43.000000000 
+0100
++++ readline-5.2/support/shobj-conf    2008-12-06 11:01:20.000000000 +0000
+@@ -10,7 +10,7 @@
+ # Chet Ramey
+ # [EMAIL PROTECTED]
+ 
+-# 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 [EMAIL PROTECTED]
++aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*)           # lightly tested by [EMAIL 
PROTECTED]
+       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 16:55:27.000000000 +0100
++++ readline-5.2/text.c        2008-12-06 11:01:20.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 21:42:28.000000000 +0100
++++ readline-5.2/vi_mode.c     2008-12-06 11:01:20.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;

-- 
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to