From: Richard W.M. Jones <"Richard W.M. Jones "> Date: Thu, 25 Sep 2008 19:15:04 +0000 (+0100) Subject: Added readline. X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=b3a3aaaf2afc25865d7879cf8f73bdb214496bae;p=fedora-mingw.git Added readline. --- diff --git a/readline/mingw32-readline.spec b/readline/mingw32-readline.spec new file mode 100644 index 0000000..1449019 --- /dev/null +++ b/readline/mingw32-readline.spec @@ -0,0 +1,123 @@ +%define __strip %{_mingw32_strip} +%define __objdump %{_mingw32_objdump} +%define _use_internal_dependency_generator 0 +%define __find_requires %{_mingw32_findrequires} +%define __find_provides %{_mingw32_findprovides} + +Name: mingw32-readline +Version: 5.2 +Release: 1%{?dist} +Summary: MinGW port of readline for editing typed command lines + +License: GPLv2+ +Group: System Environment/Libraries +URL: http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html +Source0: ftp://ftp.gnu.org/gnu/readline/readline-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +Patch1: readline-5.2-shlib.patch +Patch2: readline-5.2-001.patch +Patch3: readline-5.2-002.patch +Patch4: readline-5.2-003.patch +Patch5: readline-5.2-004.patch +Patch6: readline-5.2-005.patch +Patch7: readline-5.2-006.patch +Patch8: readline-5.2-007.patch +Patch9: readline-5.2-008.patch +Patch10: readline-5.2-009.patch +Patch11: readline-5.2-010.patch +Patch12: readline-5.2-011.patch +Patch13: readline-5.2-redisplay-sigint.patch + +BuildArch: noarch + +BuildRequires: mingw32-filesystem >= 29 +BuildRequires: mingw32-gcc +BuildRequires: mingw32-binutils +BuildRequires: mingw32-termcap + + +%description +The Readline library provides a set of functions that allow users to +edit command lines. Both Emacs and vi editing modes are available. The +Readline library includes additional functions for maintaining a list +of previously-entered command lines for recalling or editing those +lines, and for performing csh-like history expansion on previous +commands. + +This is a port of the library and development tools to Windows. + + +%prep +%setup -q -n readline-%{version} +%patch1 -p1 -b .shlib +%patch2 -p0 -b .001 +%patch3 -p0 -b .002 +%patch4 -p0 -b .003 +%patch5 -p0 -b .004 +%patch6 -p0 -b .005 +%patch7 -p0 -b .006 +%patch8 -p0 -b .007 +%patch9 -p0 -b .008 +%patch10 -p0 -b .009 +%patch11 -p0 -b .010 +%patch12 -p0 -b .011 +%patch13 -p1 -b .redisplay-sigint + +pushd examples +rm -f rlfe/configure +iconv -f iso8859-1 -t utf8 -o rl-fgets.c{_,} +touch -r rl-fgets.c{,_} +mv -f rl-fgets.c{_,} +popd + + +%build +%{_mingw32_configure} --enable-shared +make SHLIB_LIBS=-ltermcap + +# Rebuild the DLLs correctly and create implibs. +pushd shlib +%{_mingw32_cc} -shared -o readline.dll -Wl,--out-implib,readline.dll.a 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 history.so histexpand.so histfile.so histsearch.so shell.so mbutil.so tilde.so compat.so -ltermcap +%{_mingw32_cc} -shared -o history.dll -Wl,--out-implib,history.dll.a history.so histexpand.so histfile.so histsearch.so shell.so mbutil.so xmalloc.so +popd + + +%install +rm -rf $RPM_BUILD_ROOT +make DESTDIR=$RPM_BUILD_ROOT install + +# Remove the fake .so files and install our DLLs and implibs. +pushd shlib +rm $RPM_BUILD_ROOT%{_mingw32_libdir}/lib*.so.* +mkdir -p $RPM_BUILD_ROOT%{_mingw32_bindir} +install readline.dll $RPM_BUILD_ROOT%{_mingw32_bindir} +install readline.dll.a $RPM_BUILD_ROOT%{_mingw32_libdir} +install history.dll $RPM_BUILD_ROOT%{_mingw32_bindir} +install history.dll.a $RPM_BUILD_ROOT%{_mingw32_libdir} +popd + +# Don't want the info files or manpages which duplicate the native package. +rm -rf $RPM_BUILD_ROOT%{_mingw32_prefix}/{info,man} + +# Don't want the static library. +rm $RPM_BUILD_ROOT%{_mingw32_libdir}/libhistory.a +rm $RPM_BUILD_ROOT%{_mingw32_libdir}/libreadline.a + + +%clean +rm -rf $RPM_BUILD_ROOT + + +%files +%defattr(-,root,root) +%{_mingw32_bindir}/readline.dll +%{_mingw32_bindir}/history.dll +%{_mingw32_libdir}/readline.dll.a +%{_mingw32_libdir}/history.dll.a +%{_mingw32_includedir}/readline/ + + +%changelog +* Thu Sep 25 2008 Richard W.M. Jones - 5.2-1 +- Initial RPM release. diff --git a/readline/readline-5.2-001.patch b/readline/readline-5.2-001.patch new file mode 100644 index 0000000..0bec9a2 --- /dev/null +++ b/readline/readline-5.2-001.patch @@ -0,0 +1,30 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-001 + +Bug-Reported-by: ebb9@byu.net +Bug-Reference-ID: <45540862.9030900@byu.net> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00017.html + http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00016.html + +Bug-Description: + +In some cases, code that is intended to be used in the presence of multibyte +characters is called when no such characters are present, leading to incorrect +display position calculations and incorrect redisplay. + +Patch: + +*** ../readline-5.2/display.c Thu Sep 14 14:20:12 2006 +--- display.c Mon Nov 13 17:55:57 2006 +*************** +*** 2381,2384 **** +--- 2409,2414 ---- + if (end <= start) + return 0; ++ if (MB_CUR_MAX == 1 || rl_byte_oriented) ++ return (end - start); + + memset (&ps, 0, sizeof (mbstate_t)); diff --git a/readline/readline-5.2-002.patch b/readline/readline-5.2-002.patch new file mode 100644 index 0000000..b0d8c92 --- /dev/null +++ b/readline/readline-5.2-002.patch @@ -0,0 +1,49 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-002 + +Bug-Reported-by: Magnus Svensson +Bug-Reference-ID: <45BDC44D.80609@mysql.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-01/msg00002.html + +Bug-Description: + +Readline neglects to reallocate the array it uses to keep track of wrapped +screen lines when increasing its size. This will eventually result in +segmentation faults when given sufficiently long input. + +Patch: + +*** ../readline-5.2-patched/display.c Thu Sep 14 14:20:12 2006 +--- display.c Fri Feb 2 20:23:17 2007 +*************** +*** 561,574 **** +--- 561,586 ---- + 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)) \ ++ { \ ++ inv_lbsize *= 2; \ ++ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ ++ } \ ++ } while (0) ++ #endif /* HANDLE_MULTIBYTE */ + + #if defined (HANDLE_MULTIBYTE) + #define CHECK_LPOS() \ diff --git a/readline/readline-5.2-003.patch b/readline/readline-5.2-003.patch new file mode 100644 index 0000000..06916b3 --- /dev/null +++ b/readline/readline-5.2-003.patch @@ -0,0 +1,37 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-003 + +Bug-Reported-by: Peter Volkov +Bug-Reference-ID: <1171795523.8021.18.camel@localhost> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-02/msg00054.html + +Bug-Description: + +When moving the cursor, bash sometimes misplaces the cursor when the prompt +contains two or more multibyte characters. The particular circumstance that +uncovered the problem was having the (multibyte) current directory name in +the prompt string. + +Patch: + +*** ../readline-5.2.2/display.c Fri Jan 19 13:34:50 2007 +--- display.c Sat Mar 10 17:25:44 2007 +*************** +*** 1745,1749 **** + { + dpos = _rl_col_width (data, 0, new); +! if (dpos > prompt_last_invisible) /* XXX - don't use woff here */ + { + dpos -= woff; +--- 1745,1752 ---- + { + dpos = _rl_col_width (data, 0, new); +! /* 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; diff --git a/readline/readline-5.2-004.patch b/readline/readline-5.2-004.patch new file mode 100644 index 0000000..b165ad9 --- /dev/null +++ b/readline/readline-5.2-004.patch @@ -0,0 +1,70 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-004 + +Bug-Reported-by: Peter Volkov +Bug-Reference-ID: <1173636022.7039.36.camel@localhost> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00039.html + +Bug-Description: + +When restoring the original prompt after finishing an incremental search, +bash sometimes places the cursor incorrectly if the primary prompt contains +invisible characters. + +Patch: + +*** ../readline-5.2.3/display.c Fri Apr 20 13:30:16 2007 +--- display.c Fri Apr 20 15:17:01 2007 +*************** +*** 1599,1604 **** + if (temp > 0) + { + _rl_output_some_chars (nfd, temp); +! _rl_last_c_pos += _rl_col_width (nfd, 0, temp);; + } + } +--- 1599,1618 ---- + 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); +! 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; + } + } +*************** +*** 1608,1613 **** +--- 1622,1639 ---- + 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); diff --git a/readline/readline-5.2-005.patch b/readline/readline-5.2-005.patch new file mode 100644 index 0000000..d192ac1 --- /dev/null +++ b/readline/readline-5.2-005.patch @@ -0,0 +1,328 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-005 + +Bug-Reported-by: Thomas Loeber +Bug-Reference-ID: <200703082223.08919.ifp@loeber1.de> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00036.html + +Bug-Description: + +When rl_read_key returns -1, indicating that readline's controlling terminal +has been invalidated for some reason (e.g., receiving a SIGHUP), the error +status was not reported correctly to the caller. This could cause input +loops. + +Patch: + +*** ../readline-5.2/complete.c Fri Jul 28 11:35:49 2006 +--- complete.c Tue Mar 13 08:50:16 2007 +*************** +*** 429,433 **** + if (c == 'n' || c == 'N' || c == RUBOUT) + return (0); +! if (c == ABORT_CHAR) + _rl_abort_internal (); + if (for_pager && (c == NEWLINE || c == RETURN)) +--- 440,444 ---- + if (c == 'n' || c == 'N' || c == RUBOUT) + return (0); +! if (c == ABORT_CHAR || c < 0) + _rl_abort_internal (); + if (for_pager && (c == NEWLINE || c == RETURN)) +*** ../readline-5.2/input.c Wed Aug 16 15:15:16 2006 +--- input.c Wed May 2 16:07:59 2007 +*************** +*** 514,518 **** + int size; + { +! int mb_len = 0; + size_t mbchar_bytes_length; + wchar_t wc; +--- 522,526 ---- + int size; + { +! int mb_len, c; + size_t mbchar_bytes_length; + wchar_t wc; +*************** +*** 521,531 **** + memset(&ps, 0, sizeof (mbstate_t)); + memset(&ps_back, 0, sizeof (mbstate_t)); +! + while (mb_len < size) + { + RL_SETSTATE(RL_STATE_MOREINPUT); +! mbchar[mb_len++] = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); + if (mbchar_bytes_length == (size_t)(-1)) +--- 529,545 ---- + 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); +! 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)) +*************** +*** 565,569 **** + c = first; + memset (mb, 0, mlen); +! for (i = 0; i < mlen; i++) + { + mb[i] = (char)c; +--- 579,583 ---- + c = first; + memset (mb, 0, mlen); +! for (i = 0; c >= 0 && i < mlen; i++) + { + mb[i] = (char)c; +*** ../readline-5.2/isearch.c Mon Dec 26 17:18:53 2005 +--- isearch.c Fri Mar 9 14:30:59 2007 +*************** +*** 328,333 **** + + f = (rl_command_func_t *)NULL; +! +! /* Translate the keys we do something with to opcodes. */ + if (c >= 0 && _rl_keymap[c].type == ISFUNC) + { +--- 328,340 ---- + + f = (rl_command_func_t *)NULL; +! +! 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) + { +*** ../readline-5.2/misc.c Mon Dec 26 17:20:46 2005 +--- misc.c Fri Mar 9 14:44:11 2007 +*************** +*** 147,150 **** +--- 147,152 ---- + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); ++ if (key < 0) ++ return -1; + return (_rl_dispatch (key, _rl_keymap)); + } +*** ../readline-5.2/readline.c Wed Aug 16 15:00:36 2006 +--- readline.c Fri Mar 9 14:47:24 2007 +*************** +*** 646,649 **** +--- 669,677 ---- + { + 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; +*** ../readline-5.2/text.c Fri Jul 28 11:55:27 2006 +--- text.c Sun Mar 25 13:41:38 2007 +*************** +*** 858,861 **** +--- 864,870 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + #if defined (HANDLE_SIGNALS) + if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) +*************** +*** 1521,1524 **** +--- 1530,1536 ---- + 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)); +*************** +*** 1537,1540 **** +--- 1549,1555 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + if (count < 0) + return (_rl_char_search_internal (-count, bdir, c)); +*** ../readline-5.2/vi_mode.c Sat Jul 29 16:42:28 2006 +--- vi_mode.c Fri Mar 9 15:02:11 2007 +*************** +*** 887,890 **** +--- 887,897 ---- + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); ++ ++ if (c < 0) ++ { ++ *nextkey = 0; ++ return -1; ++ } ++ + *nextkey = c; + +*************** +*** 903,906 **** +--- 910,918 ---- + c = rl_read_key (); /* real command */ + RL_UNSETSTATE(RL_STATE_MOREINPUT); ++ if (c < 0) ++ { ++ *nextkey = 0; ++ return -1; ++ } + *nextkey = c; + } +*************** +*** 1225,1236 **** + _rl_callback_generic_arg *data; + { + #if defined (HANDLE_MULTIBYTE) +! _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 (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + #endif + + _rl_callback_func = 0; + _rl_want_redisplay = 1; +--- 1243,1262 ---- + _rl_callback_generic_arg *data; + { ++ int c; + #if defined (HANDLE_MULTIBYTE) +! c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +! c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + #endif + ++ if (c <= 0) ++ return -1; ++ ++ #if !defined (HANDLE_MULTIBYTE) ++ _rl_vi_last_search_char = c; ++ #endif ++ + _rl_callback_func = 0; + _rl_want_redisplay = 1; +*************** +*** 1248,1251 **** +--- 1274,1278 ---- + int count, key; + { ++ int c; + #if defined (HANDLE_MULTIBYTE) + static char *target; +*************** +*** 1294,1302 **** + { + #if defined (HANDLE_MULTIBYTE) +! _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 (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + #endif + } +--- 1321,1335 ---- + { + #if defined (HANDLE_MULTIBYTE) +! c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); +! if (c <= 0) +! return -1; +! _rl_vi_last_search_mblen = c; + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +! c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); ++ if (c < 0) ++ return -1; ++ _rl_vi_last_search_char = c; + #endif + } +*************** +*** 1468,1471 **** +--- 1501,1507 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + #if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +*************** +*** 1486,1489 **** +--- 1522,1528 ---- + _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; +*************** +*** 1517,1520 **** +--- 1556,1562 ---- + _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)); + } +*************** +*** 1651,1655 **** + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +! if (ch < 'a' || ch > 'z') + { + rl_ding (); +--- 1693,1697 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +! if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); +*************** +*** 1703,1707 **** + return 0; + } +! else if (ch < 'a' || ch > 'z') + { + rl_ding (); +--- 1745,1749 ---- + return 0; + } +! else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); diff --git a/readline/readline-5.2-006.patch b/readline/readline-5.2-006.patch new file mode 100644 index 0000000..d739143 --- /dev/null +++ b/readline/readline-5.2-006.patch @@ -0,0 +1,62 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-006 + +Bug-Reported-by: Peter Volkov +Bug-Reference-ID: <1178376645.9063.25.camel@localhost> +Bug-Reference-URL: http://bugs.gentoo.org/177095 + +Bug-Description: + +The readline display code miscalculated the screen position when performing +a redisplay in which the new text occupies more screen space that the old, +but takes fewer bytes to do so (e.g., when replacing a shorter string +containing multibyte characters with a longer one containing only ASCII). + +Patch: + +*** ../readline-5.2/display.c Thu Apr 26 11:38:22 2007 +--- display.c Thu Jul 12 23:10:10 2007 +*************** +*** 1519,1527 **** + /* Non-zero if we're increasing the number of lines. */ + int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin; + /* 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)) + { + /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and +--- 1568,1596 ---- + /* 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. */ +! 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 diff --git a/readline/readline-5.2-007.patch b/readline/readline-5.2-007.patch new file mode 100644 index 0000000..f75f53f --- /dev/null +++ b/readline/readline-5.2-007.patch @@ -0,0 +1,65 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-007 + +Bug-Reported-by: Tom Bjorkholm +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-04/msg00004.html + + +Bug-Description: + +An off-by-one error in readline's input buffering caused readline to drop +each 511th character of buffered input (e.g., when pasting a large amount +of data into a terminal window). + +Patch: + +*** ../readline-5.2/input.c Wed Aug 16 15:15:16 2006 +--- input.c Tue Jul 17 09:24:21 2007 +*************** +*** 134,139 **** + + *key = ibuffer[pop_index++]; +! + if (pop_index >= ibuffer_len) + pop_index = 0; + +--- 134,142 ---- + + *key = ibuffer[pop_index++]; +! #if 0 + if (pop_index >= ibuffer_len) ++ #else ++ if (pop_index > ibuffer_len) ++ #endif + pop_index = 0; + +*************** +*** 251,255 **** + { + k = (*rl_getc_function) (rl_instream); +! rl_stuff_char (k); + if (k == NEWLINE || k == RETURN) + break; +--- 254,259 ---- + { + k = (*rl_getc_function) (rl_instream); +! if (rl_stuff_char (k) == 0) +! break; /* some problem; no more room */ + if (k == NEWLINE || k == RETURN) + break; +*************** +*** 374,378 **** +--- 378,386 ---- + } + ibuffer[push_index++] = key; ++ #if 0 + if (push_index >= ibuffer_len) ++ #else ++ if (push_index > ibuffer_len) ++ #endif + push_index = 0; + diff --git a/readline/readline-5.2-008.patch b/readline/readline-5.2-008.patch new file mode 100644 index 0000000..1d7f327 --- /dev/null +++ b/readline/readline-5.2-008.patch @@ -0,0 +1,70 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-008 + +Bug-Reported-by: dAniel hAhler +Bug-Reference-ID: <4702ED8A.5000503@thequod.de> +Bug-Reference-URL: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/119938 + +Bug-Description: + +When updating the display after displaying, for instance, a list of possible +completions, readline will place the cursor at the wrong position if the +prompt contains invisible characters and a newline. + +Patch: + +*** ../readline-5.2-patched/display.c Mon Aug 6 14:26:29 2007 +--- display.c Wed Oct 10 22:43:58 2007 +*************** +*** 1049,1053 **** + else + tx = nleft; +! if (_rl_last_c_pos > tx) + { + _rl_backspace (_rl_last_c_pos - tx); /* XXX */ +--- 1049,1053 ---- + else + tx = nleft; +! if (tx >= 0 && _rl_last_c_pos > tx) + { + _rl_backspace (_rl_last_c_pos - tx); /* XXX */ +*************** +*** 1205,1209 **** + { + register char *ofd, *ols, *oe, *nfd, *nls, *ne; +! int temp, lendiff, wsatend, od, nd; + int current_invis_chars; + int col_lendiff, col_temp; +--- 1205,1209 ---- + { + register char *ofd, *ols, *oe, *nfd, *nls, *ne; +! int temp, lendiff, wsatend, od, nd, o_cpos; + int current_invis_chars; + int col_lendiff, col_temp; +*************** +*** 1466,1469 **** +--- 1466,1471 ---- + } + ++ 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 +*************** +*** 1475,1479 **** + 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) + cpos_adjusted = 1; + #endif +--- 1477,1483 ---- + 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 diff --git a/readline/readline-5.2-009.patch b/readline/readline-5.2-009.patch new file mode 100644 index 0000000..af9e381 --- /dev/null +++ b/readline/readline-5.2-009.patch @@ -0,0 +1,45 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-009 + +Bug-Reported-by: dAniel hAhler +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +Under some circumstances, readline will incorrectly display a prompt string +containing invisible characters after the final newline. + +Patch: + +*** ../readline-5.2-patched/display.c 2007-08-25 13:47:08.000000000 -0400 +--- display.c 2007-11-10 17:51:29.000000000 -0500 +*************** +*** 392,396 **** + local_prompt = expand_prompt (p, &prompt_visible_length, + &prompt_last_invisible, +! (int *)NULL, + &prompt_physical_chars); + c = *t; *t = '\0'; +--- 420,424 ---- + local_prompt = expand_prompt (p, &prompt_visible_length, + &prompt_last_invisible, +! &prompt_invis_chars_first_line, + &prompt_physical_chars); + c = *t; *t = '\0'; +*************** +*** 399,403 **** + local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length, + (int *)NULL, +! &prompt_invis_chars_first_line, + (int *)NULL); + *t = c; +--- 427,431 ---- + local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length, + (int *)NULL, +! (int *)NULL, + (int *)NULL); + *t = c; diff --git a/readline/readline-5.2-010.patch b/readline/readline-5.2-010.patch new file mode 100644 index 0000000..ee5c026 --- /dev/null +++ b/readline/readline-5.2-010.patch @@ -0,0 +1,47 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-010 + +Bug-Reported-by: Miroslav Lichvar +Bug-Reference-ID: Fri, 02 Nov 2007 14:07:45 +0100 +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-11/msg00000.html + +Bug-Description: + +In certain cases when outputting characters at the end of the line, +e.g., when displaying the prompt string, readline positions the cursor +incorrectly if the prompt string contains invisible characters and the +text being drawn begins before the last invisible character in the line. + +Patch: + +*** ../readline-5.2-patched/display.c 2007-08-25 13:47:08.000000000 -0400 +--- display.c 2007-11-10 17:51:29.000000000 -0500 +*************** +*** 1566,1574 **** + 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; + return; + } +--- 1619,1632 ---- + else + { + _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; + } diff --git a/readline/readline-5.2-011.patch b/readline/readline-5.2-011.patch new file mode 100644 index 0000000..a1197ed --- /dev/null +++ b/readline/readline-5.2-011.patch @@ -0,0 +1,32 @@ + READLINE PATCH REPORT + ===================== + +Readline-Release: 5.2 +Patch-ID: readline52-011 + +Bug-Reported-by: Uwe Doering +Bug-Reference-ID: <46F3DD72.2090801@geminix.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-09/msg00102.html + +Bug-Description: + +There is an off-by-one error in the code that buffers characters received +very quickly in succession, causing characters to be dropped. + +Patch: + +*** ../readline-5.2-patched/input.c 2007-08-25 13:47:10.000000000 -0400 +--- input.c 2007-10-12 22:55:25.000000000 -0400 +*************** +*** 155,159 **** + pop_index--; + if (pop_index < 0) +! pop_index = ibuffer_len - 1; + ibuffer[pop_index] = key; + return (1); +--- 155,159 ---- + pop_index--; + if (pop_index < 0) +! pop_index = ibuffer_len; + ibuffer[pop_index] = key; + return (1); diff --git a/readline/readline-5.2-redisplay-sigint.patch b/readline/readline-5.2-redisplay-sigint.patch new file mode 100644 index 0000000..c1c48b2 --- /dev/null +++ b/readline/readline-5.2-redisplay-sigint.patch @@ -0,0 +1,164 @@ +GDB PR 544: gdb.cp/annota2.exp and gdb.cp/annota3.exp sometimes FAIL with: + FAIL: gdb.cp/annota3.exp: annotate-quit (pattern 1) + +One can put `sleep (1)' at the end of _RL_OUTPUT_SOME_CHARS and type + p 1 +to abort the prompt printing. Before the patch: + (gdb) p 1 + $1 = 1 + Quit) (gdb) + (gdb) _ +After the patch: + [bash]jkratoch@host0.dyn.jankratochvil.net:/home/jkratoch/redhat/sources/readline# ../gdb/gdb -nx -silent(gdb) p 1 + $1 = 1 + (gdb) Quit + (gdb) _ + +The readline patch posted upstream: + http://sourceware.org/ml/gdb-patches/2008-03/msg00317.html + +On Fri, 21 Mar 2008 19:37:31 +0100, Chet Ramey wrote: +> I will add something like your block_sigint/release_sigint changes around +> the guts of rl_redisplay. That's the right thing to do anyway. It will +> probably not come out as a patch for readline-5.2; you can use your +> current patch (though the names will change to _rl_block_sigint and +> _rl_release_sigint -- fair warning). + +Application cannot easily supply its own RL_REDISPLAY_FUNCTION as a custom +function there changes the readline behavior: + http://sourceware.org/ml/gdb-patches/2008-03/msg00340.html + +BLOCK_SIGINT / RELEASE_SIGINT: Make it public and prefix it by `_rl_'. +RL_REDISPLAY: Wrap it by _RL_BLOCK_SIGINT / _RL_RELEASE_SIGINT. + +--- readline-5.2-orig/display.c 2008-03-23 20:52:12.000000000 +0100 ++++ readline-5.2/display.c 2008-03-23 20:56:58.000000000 +0100 +@@ -472,6 +472,10 @@ rl_redisplay () + if (!readline_echoing_p) + 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 (); ++ + if (!rl_display_prompt) + rl_display_prompt = ""; + +@@ -1180,6 +1184,8 @@ rl_redisplay () + else + visible_wrap_offset = wrap_offset; + } ++ ++ _rl_release_sigint (); + } + + /* PWP: update_line() is based on finding the middle difference of each +--- readline-5.2-orig/rltty.c 2005-12-26 23:21:50.000000000 +0100 ++++ readline-5.2/rltty.c 2008-03-23 20:57:26.000000000 +0100 +@@ -52,8 +52,8 @@ extern int errno; + rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal; + rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal; + +-static void block_sigint PARAMS((void)); +-static void release_sigint PARAMS((void)); ++void _rl_block_sigint PARAMS((void)); ++void _rl_release_sigint PARAMS((void)); + + static void set_winsize PARAMS((int)); + +@@ -74,9 +74,9 @@ static int sigint_oldmask; + static int sigint_blocked; + + /* Cause SIGINT to not be delivered until the corresponding call to +- release_sigint(). */ +-static void +-block_sigint () ++ _rl_release_sigint(). */ ++void ++_rl_block_sigint () + { + if (sigint_blocked) + return; +@@ -100,8 +100,8 @@ block_sigint () + } + + /* Allow SIGINT to be delivered. */ +-static void +-release_sigint () ++void ++_rl_release_sigint () + { + if (sigint_blocked == 0) + return; +@@ -663,7 +663,7 @@ rl_prep_terminal (meta_flag) + return; + + /* Try to keep this function from being INTerrupted. */ +- block_sigint (); ++ _rl_block_sigint (); + + tty = fileno (rl_instream); + +@@ -676,7 +676,7 @@ rl_prep_terminal (meta_flag) + if (errno == ENOTTY) + #endif + readline_echoing_p = 1; /* XXX */ +- release_sigint (); ++ _rl_release_sigint (); + return; + } + +@@ -711,7 +711,7 @@ rl_prep_terminal (meta_flag) + + if (set_tty_settings (tty, &tio) < 0) + { +- release_sigint (); ++ _rl_release_sigint (); + return; + } + +@@ -722,7 +722,7 @@ rl_prep_terminal (meta_flag) + terminal_prepped = 1; + RL_SETSTATE(RL_STATE_TERMPREPPED); + +- release_sigint (); ++ _rl_release_sigint (); + } + + /* Restore the terminal's normal settings and modes. */ +@@ -735,7 +735,7 @@ rl_deprep_terminal () + return; + + /* Try to keep this function from being interrupted. */ +- block_sigint (); ++ _rl_block_sigint (); + + tty = fileno (rl_instream); + +@@ -746,14 +746,14 @@ rl_deprep_terminal () + + if (set_tty_settings (tty, &otio) < 0) + { +- release_sigint (); ++ _rl_release_sigint (); + return; + } + + terminal_prepped = 0; + RL_UNSETSTATE(RL_STATE_TERMPREPPED); + +- release_sigint (); ++ _rl_release_sigint (); + } + #endif /* !NO_TTY_DRIVER */ + +--- readline-5.2-orig/rltty.h 2003-02-01 04:43:11.000000000 +0100 ++++ readline-5.2/rltty.h 2008-03-23 20:57:30.000000000 +0100 +@@ -79,4 +79,7 @@ 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_ */ diff --git a/readline/readline-5.2-shlib.patch b/readline/readline-5.2-shlib.patch new file mode 100644 index 0000000..f97fa17 --- /dev/null +++ b/readline/readline-5.2-shlib.patch @@ -0,0 +1,38 @@ +--- readline-5.2/support/shlib-install.shlib 2006-01-03 20:06:27.000000000 +0100 ++++ readline-5.2/support/shlib-install 2006-11-13 13:51:02.000000000 +0100 +@@ -71,7 +71,7 @@ + case "$host_os" in + hpux*|darwin*|macosx*|linux*) + if [ -z "$uninstall" ]; then +- chmod 555 ${INSTALLDIR}/${LIBNAME} ++ chmod 755 ${INSTALLDIR}/${LIBNAME} + fi ;; + cygwin*) + IMPLIBNAME=`echo ${LIBNAME} \ +--- readline-5.2/support/shobj-conf.shlib 2006-04-11 15:15:43.000000000 +0200 ++++ readline-5.2/support/shobj-conf 2007-03-15 14:11:36.000000000 +0100 +@@ -108,10 +108,11 @@ + linux*-*|gnu*-*|k*bsd*-gnu-*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' +- SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' ++ SHOBJ_LDFLAGS='$(CFLAGS) -shared -Wl,-soname,$@' + +- SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`' ++ SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' ++ SHLIB_LIBS='-ltinfo' + ;; + + freebsd2* | netbsd*) +--- readline-5.2/shlib/Makefile.in.shlib 2005-08-12 05:56:10.000000000 +0200 ++++ readline-5.2/shlib/Makefile.in 2007-11-05 18:59:14.000000000 +0100 +@@ -168,7 +168,7 @@ $(SHARED_READLINE): $(SHARED_OBJ) + + $(SHARED_HISTORY): $(SHARED_HISTOBJ) xmalloc.so + $(RM) $@ +- $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so $(SHLIB_LIBS) ++ $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so + + # 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