source: scripts/patches/readline-5.0-fixes-1.patch@ 5548691

clfs-1.2 clfs-2.1 clfs-3.0.0-systemd clfs-3.0.0-sysvinit systemd sysvinit
Last change on this file since 5548691 was 7f65c0e, checked in by Jim Gifford <clfs@…>, 19 years ago

r625@server (orig r623): jim | 2005-10-31 12:43:24 -0800
Final Move

  • Property mode set to 100644
File size: 6.8 KB
RevLine 
[617118d]1Submitted By: Jim Gifford (patches at jg555 dot com)
2Date: 2004-09-29
3Initial Package Version: 5.0
4Origin: Various
5Upstream Status: Already Applied
6Description: This patch contains various fixes recommended
7 by the author Chet. The original patches are
8 avaiable at ftp://ftp.cwru.edu/pub/bash/readline-5.0-patches
9
10
11diff -Naur readline-5.0.orig/display.c readline-5.0/display.c
12--- readline-5.0.orig/display.c 2004-05-28 02:57:51.000000000 +0000
13+++ readline-5.0/display.c 2004-09-29 16:50:55.112047008 +0000
14@@ -201,7 +201,7 @@
15 int *lp, *lip, *niflp, *vlp;
16 {
17 char *r, *ret, *p;
18- int l, rl, last, ignoring, ninvis, invfl, ind, pind, physchars;
19+ int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars;
20
21 /* Short-circuit if we can. */
22 if ((MB_CUR_MAX <= 1 || rl_byte_oriented) && strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
23@@ -222,6 +222,7 @@
24 r = ret = (char *)xmalloc (l + 1);
25
26 invfl = 0; /* invisible chars in first line of prompt */
27+ invflset = 0; /* we only want to set invfl once */
28
29 for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++)
30 {
31@@ -249,7 +250,10 @@
32 while (l--)
33 *r++ = *p++;
34 if (!ignoring)
35- rl += ind - pind;
36+ {
37+ rl += ind - pind;
38+ physchars += _rl_col_width (pmt, pind, ind);
39+ }
40 else
41 ninvis += ind - pind;
42 p--; /* compensate for later increment */
43@@ -259,16 +263,19 @@
44 {
45 *r++ = *p;
46 if (!ignoring)
47- rl++; /* visible length byte counter */
48+ {
49+ rl++; /* visible length byte counter */
50+ physchars++;
51+ }
52 else
53 ninvis++; /* invisible chars byte counter */
54 }
55
56- if (rl >= _rl_screenwidth)
57- invfl = ninvis;
58-
59- if (ignoring == 0)
60- physchars++;
61+ if (invflset == 0 && rl >= _rl_screenwidth)
62+ {
63+ invfl = ninvis;
64+ invflset = 1;
65+ }
66 }
67 }
68
69@@ -351,14 +358,14 @@
70 local_prompt = expand_prompt (p, &prompt_visible_length,
71 &prompt_last_invisible,
72 (int *)NULL,
73- (int *)NULL);
74+ &prompt_physical_chars);
75 c = *t; *t = '\0';
76 /* The portion of the prompt string up to and including the
77 final newline is now null-terminated. */
78 local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
79 (int *)NULL,
80 &prompt_invis_chars_first_line,
81- &prompt_physical_chars);
82+ (int *)NULL);
83 *t = c;
84 return (prompt_prefix_length);
85 }
86@@ -417,7 +424,7 @@
87 register int in, out, c, linenum, cursor_linenum;
88 register char *line;
89 int c_pos, inv_botlin, lb_botlin, lb_linenum;
90- int newlines, lpos, temp, modmark;
91+ int newlines, lpos, temp, modmark, n0, num;
92 char *prompt_this_line;
93 #if defined (HANDLE_MULTIBYTE)
94 wchar_t wc;
95@@ -573,6 +580,7 @@
96
97 #if defined (HANDLE_MULTIBYTE)
98 memset (_rl_wrapped_line, 0, vis_lbsize);
99+ num = 0;
100 #endif
101
102 /* prompt_invis_chars_first_line is the number of invisible characters in
103@@ -591,13 +599,32 @@
104 probably too much work for the benefit gained. How many people have
105 prompts that exceed two physical lines?
106 Additional logic fix from Edward Catmur <ed@catmur.co.uk> */
107+#if defined (HANDLE_MULTIBYTE)
108+ n0 = num;
109+ temp = local_prompt ? strlen (local_prompt) : 0;
110+ while (num < temp)
111+ {
112+ if (_rl_col_width (local_prompt, n0, num) > _rl_screenwidth)
113+ {
114+ num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY);
115+ break;
116+ }
117+ num++;
118+ }
119+ temp = num +
120+#else
121 temp = ((newlines + 1) * _rl_screenwidth) +
122+#endif /* !HANDLE_MULTIBYTE */
123 ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line
124 : ((newlines == 1) ? wrap_offset : 0))
125 : ((newlines == 0) ? wrap_offset :0));
126
127 inv_lbreaks[++newlines] = temp;
128+#if defined (HANDLE_MULTIBYTE)
129+ lpos -= _rl_col_width (local_prompt, n0, num);
130+#else
131 lpos -= _rl_screenwidth;
132+#endif
133 }
134
135 prompt_last_screen_line = newlines;
136diff -Naur readline-5.0.orig/mbutil.c readline-5.0/mbutil.c
137--- readline-5.0.orig/mbutil.c 2004-01-14 14:44:52.000000000 +0000
138+++ readline-5.0/mbutil.c 2004-09-29 16:50:58.864476552 +0000
139@@ -126,11 +126,11 @@
140 if (find_non_zero)
141 {
142 tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
143- while (wcwidth (wc) == 0)
144+ while (tmp > 0 && wcwidth (wc) == 0)
145 {
146 point += tmp;
147 tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
148- if (tmp == (size_t)(0) || tmp == (size_t)(-1) || tmp == (size_t)(-2))
149+ if (MB_NULLWCH (tmp) || MB_INVALIDCH (tmp))
150 break;
151 }
152 }
153diff -Naur readline-5.0.orig/misc.c readline-5.0/misc.c
154--- readline-5.0.orig/misc.c 2004-07-07 12:56:32.000000000 +0000
155+++ readline-5.0/misc.c 2004-09-29 16:50:53.976219680 +0000
156@@ -276,12 +276,6 @@
157 _rl_saved_line_for_history->line = savestring (rl_line_buffer);
158 _rl_saved_line_for_history->data = (char *)rl_undo_list;
159 }
160- else if (STREQ (rl_line_buffer, _rl_saved_line_for_history->line) == 0)
161- {
162- free (_rl_saved_line_for_history->line);
163- _rl_saved_line_for_history->line = savestring (rl_line_buffer);
164- _rl_saved_line_for_history->data = (char *)rl_undo_list; /* XXX possible memleak */
165- }
166
167 return 0;
168 }
169diff -Naur readline-5.0.orig/vi_mode.c readline-5.0/vi_mode.c
170--- readline-5.0.orig/vi_mode.c 2004-07-13 18:08:27.000000000 +0000
171+++ readline-5.0/vi_mode.c 2004-09-29 16:50:56.286868408 +0000
172@@ -272,10 +272,12 @@
173 switch (key)
174 {
175 case '?':
176+ _rl_free_saved_history_line ();
177 rl_noninc_forward_search (count, key);
178 break;
179
180 case '/':
181+ _rl_free_saved_history_line ();
182 rl_noninc_reverse_search (count, key);
183 break;
184
185@@ -690,7 +692,7 @@
186 {
187 wchar_t wc;
188 char mb[MB_LEN_MAX+1];
189- int mblen;
190+ int mblen, p;
191 mbstate_t ps;
192
193 memset (&ps, 0, sizeof (mbstate_t));
194@@ -713,11 +715,14 @@
195 /* Vi is kind of strange here. */
196 if (wc)
197 {
198+ p = rl_point;
199 mblen = wcrtomb (mb, wc, &ps);
200 if (mblen >= 0)
201 mb[mblen] = '\0';
202 rl_begin_undo_group ();
203- rl_delete (1, 0);
204+ rl_vi_delete (1, 0);
205+ if (rl_point < p) /* Did we retreat at EOL? */
206+ rl_point++; /* XXX - should we advance more than 1 for mbchar? */
207 rl_insert_text (mb);
208 rl_end_undo_group ();
209 rl_vi_check ();
210@@ -1310,12 +1315,16 @@
211 rl_vi_delete (1, c);
212 #if defined (HANDLE_MULTIBYTE)
213 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
214- while (_rl_insert_char (1, c))
215- {
216- RL_SETSTATE (RL_STATE_MOREINPUT);
217- c = rl_read_key ();
218- RL_UNSETSTATE (RL_STATE_MOREINPUT);
219- }
220+ {
221+ if (rl_point < p) /* Did we retreat at EOL? */
222+ rl_point++;
223+ while (_rl_insert_char (1, c))
224+ {
225+ RL_SETSTATE (RL_STATE_MOREINPUT);
226+ c = rl_read_key ();
227+ RL_UNSETSTATE (RL_STATE_MOREINPUT);
228+ }
229+ }
230 else
231 #endif
232 {
Note: See TracBrowser for help on using the repository browser.