Author: jhuntwork Date: 2007-09-15 18:41:07 -0600 (Sat, 15 Sep 2007) New Revision: 1868
Added: trunk/readline/readline-5.2-fixes-4.patch Log: Add an updated readline patch, created by Matthew Burgess. Added: trunk/readline/readline-5.2-fixes-4.patch =================================================================== --- trunk/readline/readline-5.2-fixes-4.patch (rev 0) +++ trunk/readline/readline-5.2-fixes-4.patch 2007-09-16 00:41:07 UTC (rev 1868) @@ -0,0 +1,435 @@ +Submitted By: Matt Burgess (matthew at linuxfromscratch dot org) +Date: 2007-09-07 +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-007 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-08-27 19:01:11.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-08-27 19:01:12.000000000 +0000 +@@ -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() \ +@@ -1506,11 +1518,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 +@@ -1586,8 +1618,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 +1641,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 +1790,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 +2441,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-08-27 19:01:13.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); +@@ -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-08-27 19:01:11.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-08-27 19:01:11.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-08-27 19:01:11.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/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-08-27 19:01:11.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-08-27 19:01:11.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
