229 lines
6.7 KiB
Diff
229 lines
6.7 KiB
Diff
|
Patches 001-005 from ftp://ftp.cwru.edu/pub/bash/readline-5.0-patches/
|
||
|
Rediffed to apply cleanly on the vanilla 5.0 source.
|
||
|
|
||
|
/Per Liden <per@fukt.bth.se>
|
||
|
|
||
|
|
||
|
diff -Nru readline-5.0/display.c readline-5.0-new/display.c
|
||
|
--- readline-5.0/display.c 2004-05-28 04:57:51.000000000 +0200
|
||
|
+++ readline-5.0-new/display.c 2005-02-02 23:48:35.174892936 +0100
|
||
|
@@ -201,7 +201,7 @@
|
||
|
int *lp, *lip, *niflp, *vlp;
|
||
|
{
|
||
|
char *r, *ret, *p;
|
||
|
- int l, rl, last, ignoring, ninvis, invfl, ind, pind, physchars;
|
||
|
+ int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars;
|
||
|
|
||
|
/* Short-circuit if we can. */
|
||
|
if ((MB_CUR_MAX <= 1 || rl_byte_oriented) && strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
|
||
|
@@ -222,6 +222,7 @@
|
||
|
r = ret = (char *)xmalloc (l + 1);
|
||
|
|
||
|
invfl = 0; /* invisible chars in first line of prompt */
|
||
|
+ invflset = 0; /* we only want to set invfl once */
|
||
|
|
||
|
for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++)
|
||
|
{
|
||
|
@@ -249,7 +250,10 @@
|
||
|
while (l--)
|
||
|
*r++ = *p++;
|
||
|
if (!ignoring)
|
||
|
- rl += ind - pind;
|
||
|
+ {
|
||
|
+ rl += ind - pind;
|
||
|
+ physchars += _rl_col_width (pmt, pind, ind);
|
||
|
+ }
|
||
|
else
|
||
|
ninvis += ind - pind;
|
||
|
p--; /* compensate for later increment */
|
||
|
@@ -259,16 +263,19 @@
|
||
|
{
|
||
|
*r++ = *p;
|
||
|
if (!ignoring)
|
||
|
- rl++; /* visible length byte counter */
|
||
|
+ {
|
||
|
+ rl++; /* visible length byte counter */
|
||
|
+ physchars++;
|
||
|
+ }
|
||
|
else
|
||
|
ninvis++; /* invisible chars byte counter */
|
||
|
}
|
||
|
|
||
|
- if (rl >= _rl_screenwidth)
|
||
|
- invfl = ninvis;
|
||
|
-
|
||
|
- if (ignoring == 0)
|
||
|
- physchars++;
|
||
|
+ if (invflset == 0 && rl >= _rl_screenwidth)
|
||
|
+ {
|
||
|
+ invfl = ninvis;
|
||
|
+ invflset = 1;
|
||
|
+ }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@@ -351,14 +358,14 @@
|
||
|
local_prompt = expand_prompt (p, &prompt_visible_length,
|
||
|
&prompt_last_invisible,
|
||
|
(int *)NULL,
|
||
|
- (int *)NULL);
|
||
|
+ &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,
|
||
|
- &prompt_physical_chars);
|
||
|
+ (int *)NULL);
|
||
|
*t = c;
|
||
|
return (prompt_prefix_length);
|
||
|
}
|
||
|
@@ -417,7 +424,7 @@
|
||
|
register int in, out, c, linenum, cursor_linenum;
|
||
|
register char *line;
|
||
|
int c_pos, inv_botlin, lb_botlin, lb_linenum;
|
||
|
- int newlines, lpos, temp, modmark;
|
||
|
+ int newlines, lpos, temp, modmark, n0, num;
|
||
|
char *prompt_this_line;
|
||
|
#if defined (HANDLE_MULTIBYTE)
|
||
|
wchar_t wc;
|
||
|
@@ -573,6 +580,7 @@
|
||
|
|
||
|
#if defined (HANDLE_MULTIBYTE)
|
||
|
memset (_rl_wrapped_line, 0, vis_lbsize);
|
||
|
+ num = 0;
|
||
|
#endif
|
||
|
|
||
|
/* prompt_invis_chars_first_line is the number of invisible characters in
|
||
|
@@ -591,13 +599,32 @@
|
||
|
probably too much work for the benefit gained. How many people have
|
||
|
prompts that exceed two physical lines?
|
||
|
Additional logic fix from Edward Catmur <ed@catmur.co.uk> */
|
||
|
+#if defined (HANDLE_MULTIBYTE)
|
||
|
+ n0 = num;
|
||
|
+ temp = local_prompt ? strlen (local_prompt) : 0;
|
||
|
+ while (num < temp)
|
||
|
+ {
|
||
|
+ if (_rl_col_width (local_prompt, n0, num) > _rl_screenwidth)
|
||
|
+ {
|
||
|
+ num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ num++;
|
||
|
+ }
|
||
|
+ temp = num +
|
||
|
+#else
|
||
|
temp = ((newlines + 1) * _rl_screenwidth) +
|
||
|
+#endif /* !HANDLE_MULTIBYTE */
|
||
|
((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line
|
||
|
: ((newlines == 1) ? wrap_offset : 0))
|
||
|
: ((newlines == 0) ? wrap_offset :0));
|
||
|
|
||
|
inv_lbreaks[++newlines] = temp;
|
||
|
+#if defined (HANDLE_MULTIBYTE)
|
||
|
+ lpos -= _rl_col_width (local_prompt, n0, num);
|
||
|
+#else
|
||
|
lpos -= _rl_screenwidth;
|
||
|
+#endif
|
||
|
}
|
||
|
|
||
|
prompt_last_screen_line = newlines;
|
||
|
diff -Nru readline-5.0/mbutil.c readline-5.0-new/mbutil.c
|
||
|
--- readline-5.0/mbutil.c 2004-01-14 15:44:52.000000000 +0100
|
||
|
+++ readline-5.0-new/mbutil.c 2005-02-02 23:48:36.670665544 +0100
|
||
|
@@ -126,11 +126,11 @@
|
||
|
if (find_non_zero)
|
||
|
{
|
||
|
tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
|
||
|
- while (wcwidth (wc) == 0)
|
||
|
+ while (tmp > 0 && wcwidth (wc) == 0)
|
||
|
{
|
||
|
point += tmp;
|
||
|
tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
|
||
|
- if (tmp == (size_t)(0) || tmp == (size_t)(-1) || tmp == (size_t)(-2))
|
||
|
+ if (MB_NULLWCH (tmp) || MB_INVALIDCH (tmp))
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
diff -Nru readline-5.0/misc.c readline-5.0-new/misc.c
|
||
|
--- readline-5.0/misc.c 2004-07-07 14:56:32.000000000 +0200
|
||
|
+++ readline-5.0-new/misc.c 2005-02-02 23:48:33.790103456 +0100
|
||
|
@@ -276,12 +276,6 @@
|
||
|
_rl_saved_line_for_history->line = savestring (rl_line_buffer);
|
||
|
_rl_saved_line_for_history->data = (char *)rl_undo_list;
|
||
|
}
|
||
|
- else if (STREQ (rl_line_buffer, _rl_saved_line_for_history->line) == 0)
|
||
|
- {
|
||
|
- free (_rl_saved_line_for_history->line);
|
||
|
- _rl_saved_line_for_history->line = savestring (rl_line_buffer);
|
||
|
- _rl_saved_line_for_history->data = (char *)rl_undo_list; /* XXX possible memleak */
|
||
|
- }
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
diff -Nru readline-5.0/vi_mode.c readline-5.0-new/vi_mode.c
|
||
|
--- readline-5.0/vi_mode.c 2004-07-13 20:08:27.000000000 +0200
|
||
|
+++ readline-5.0-new/vi_mode.c 2005-02-02 23:48:35.948775288 +0100
|
||
|
@@ -272,10 +272,12 @@
|
||
|
switch (key)
|
||
|
{
|
||
|
case '?':
|
||
|
+ _rl_free_saved_history_line ();
|
||
|
rl_noninc_forward_search (count, key);
|
||
|
break;
|
||
|
|
||
|
case '/':
|
||
|
+ _rl_free_saved_history_line ();
|
||
|
rl_noninc_reverse_search (count, key);
|
||
|
break;
|
||
|
|
||
|
@@ -690,7 +692,7 @@
|
||
|
{
|
||
|
wchar_t wc;
|
||
|
char mb[MB_LEN_MAX+1];
|
||
|
- int mblen;
|
||
|
+ int mblen, p;
|
||
|
mbstate_t ps;
|
||
|
|
||
|
memset (&ps, 0, sizeof (mbstate_t));
|
||
|
@@ -713,11 +715,14 @@
|
||
|
/* Vi is kind of strange here. */
|
||
|
if (wc)
|
||
|
{
|
||
|
+ p = rl_point;
|
||
|
mblen = wcrtomb (mb, wc, &ps);
|
||
|
if (mblen >= 0)
|
||
|
mb[mblen] = '\0';
|
||
|
rl_begin_undo_group ();
|
||
|
- rl_delete (1, 0);
|
||
|
+ rl_vi_delete (1, 0);
|
||
|
+ if (rl_point < p) /* Did we retreat at EOL? */
|
||
|
+ rl_point++; /* XXX - should we advance more than 1 for mbchar? */
|
||
|
rl_insert_text (mb);
|
||
|
rl_end_undo_group ();
|
||
|
rl_vi_check ();
|
||
|
@@ -1310,12 +1315,16 @@
|
||
|
rl_vi_delete (1, c);
|
||
|
#if defined (HANDLE_MULTIBYTE)
|
||
|
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
|
||
|
- while (_rl_insert_char (1, c))
|
||
|
- {
|
||
|
- RL_SETSTATE (RL_STATE_MOREINPUT);
|
||
|
- c = rl_read_key ();
|
||
|
- RL_UNSETSTATE (RL_STATE_MOREINPUT);
|
||
|
- }
|
||
|
+ {
|
||
|
+ if (rl_point < p) /* Did we retreat at EOL? */
|
||
|
+ rl_point++;
|
||
|
+ while (_rl_insert_char (1, c))
|
||
|
+ {
|
||
|
+ RL_SETSTATE (RL_STATE_MOREINPUT);
|
||
|
+ c = rl_read_key ();
|
||
|
+ RL_UNSETSTATE (RL_STATE_MOREINPUT);
|
||
|
+ }
|
||
|
+ }
|
||
|
else
|
||
|
#endif
|
||
|
{
|