aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-05-25 21:52:03 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-05-25 21:52:03 +0000
commitb267ed95bc8141dbf14b276d4aef0fb8e2f5dda7 (patch)
treec1b92f55c181c430525713fa81efdf6bf3216f47
parent4830fc565acd064e4ae033a6573a432c8b3857b9 (diff)
downloadbusybox-w32-b267ed95bc8141dbf14b276d4aef0fb8e2f5dda7.tar.gz
busybox-w32-b267ed95bc8141dbf14b276d4aef0fb8e2f5dda7.tar.bz2
busybox-w32-b267ed95bc8141dbf14b276d4aef0fb8e2f5dda7.zip
lineedit: correctly handle prompt longer than screen width. closes bug 3414
-rw-r--r--libbb/lineedit.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index c91efd40c..fb595c010 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -80,10 +80,9 @@ struct lineedit_statics {
80 volatile unsigned cmdedit_termw; /* = 80; */ /* actual terminal width */ 80 volatile unsigned cmdedit_termw; /* = 80; */ /* actual terminal width */
81 sighandler_t previous_SIGWINCH_handler; 81 sighandler_t previous_SIGWINCH_handler;
82 82
83 83 unsigned cmdedit_x; /* real x terminal position */
84 int cmdedit_x; /* real x terminal position */ 84 unsigned cmdedit_y; /* pseudoreal y terminal position */
85 int cmdedit_y; /* pseudoreal y terminal position */ 85 unsigned cmdedit_prmt_len; /* length of prompt (without colors etc) */
86 int cmdedit_prmt_len; /* length of prompt (without colors etc) */
87 86
88 unsigned cursor; 87 unsigned cursor;
89 unsigned command_len; 88 unsigned command_len;
@@ -199,7 +198,7 @@ static void cmdedit_set_out_char(int next_char)
199 { 198 {
200 bb_putchar(c); 199 bb_putchar(c);
201 } 200 }
202 if (++cmdedit_x >= (int)cmdedit_termw) { 201 if (++cmdedit_x >= cmdedit_termw) {
203 /* terminal is scrolled down */ 202 /* terminal is scrolled down */
204 cmdedit_y++; 203 cmdedit_y++;
205 cmdedit_x = 0; 204 cmdedit_x = 0;
@@ -262,12 +261,12 @@ static void input_backward(unsigned num)
262 return; 261 return;
263 cursor -= num; 262 cursor -= num;
264 263
265 if ((unsigned)cmdedit_x >= num) { 264 if (cmdedit_x >= num) {
266 cmdedit_x -= num; 265 cmdedit_x -= num;
267 if (num <= 4) { 266 if (num <= 4) {
268 /* This is longer by 5 bytes on x86. 267 /* This is longer by 5 bytes on x86.
269 * Also gets mysteriously 268 * Also gets miscompiled for ARM users
270 * miscompiled for some ARM users. 269 * (busybox.net/bugs/view.php?id=2274).
271 * printf(("\b\b\b\b" + 4) - num); 270 * printf(("\b\b\b\b" + 4) - num);
272 * return; 271 * return;
273 */ 272 */
@@ -282,9 +281,12 @@ static void input_backward(unsigned num)
282 281
283 /* Need to go one or more lines up */ 282 /* Need to go one or more lines up */
284 num -= cmdedit_x; 283 num -= cmdedit_x;
285 count_y = 1 + (num / cmdedit_termw); 284 {
286 cmdedit_y -= count_y; 285 unsigned w = cmdedit_termw; /* volatile var */
287 cmdedit_x = cmdedit_termw * count_y - num; 286 count_y = 1 + (num / w);
287 cmdedit_y -= count_y;
288 cmdedit_x = w * count_y - num;
289 }
288 /* go to 1st column; go up; go to correct column */ 290 /* go to 1st column; go up; go to correct column */
289 printf("\r" "\033[%dA" "\033[%dC", count_y, cmdedit_x); 291 printf("\r" "\033[%dA" "\033[%dC", count_y, cmdedit_x);
290} 292}
@@ -292,10 +294,12 @@ static void input_backward(unsigned num)
292static void put_prompt(void) 294static void put_prompt(void)
293{ 295{
294 out1str(cmdedit_prompt); 296 out1str(cmdedit_prompt);
295 cmdedit_x = cmdedit_prmt_len;
296 cursor = 0; 297 cursor = 0;
297// Huh? what if cmdedit_prmt_len >= width? 298 {
298 cmdedit_y = 0; /* new quasireal y */ 299 unsigned w = cmdedit_termw; /* volatile var */
300 cmdedit_y = cmdedit_prmt_len / w; /* new quasireal y */
301 cmdedit_x = cmdedit_prmt_len % w;
302 }
299} 303}
300 304
301/* draw prompt, editor line, and clear tail */ 305/* draw prompt, editor line, and clear tail */