summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-05-17 10:30:44 (GMT)
committer Denys Vlasenko <vda.linux@googlemail.com>2010-05-17 10:30:44 (GMT)
commit1118d9b213e4cad56e6f79c1753e0a52defadaa5 (patch)
tree65c77fa078816d1100900998433440e365b1bd5f
parent786cce1871ade4240c629187d6609de155fe3536 (diff)
downloadbusybox-1118d9b213e4cad56e6f79c1753e0a52defadaa5.tar.gz
busybox-1118d9b213e4cad56e6f79c1753e0a52defadaa5.tar.bz2
lineedit: fix insertion deep inside line (*several lines* before end)
function old new delta input_backward 212 229 +17 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/lineedit.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 36d057b..f7d3ffe 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -486,15 +486,22 @@ static void input_backward(unsigned num)
while (cursor < sv_cursor)
put_cur_glyph_and_inc_cursor();
} else {
- int count_y;
- unsigned w;
+ int lines_up;
+ unsigned width;
+ /* num = chars to go back from the beginning of current line: */
num -= cmdedit_x;
- w = cmdedit_termw; /* read volatile var once */
- count_y = 1 + (num / w);
- cmdedit_y -= count_y;
- cmdedit_x = w * count_y - num;
- /* go to 1st column; go up; go to correct column */
- printf("\r" "\033[%uA" "\033[%uC", count_y, cmdedit_x);
+ width = cmdedit_termw; /* read volatile var once */
+ /* num=1...w: one line up, w+1...2w: two, etc: */
+ lines_up = 1 + (num - 1) / width;
+ cmdedit_x = (width * cmdedit_y - num) % width;
+ cmdedit_y -= lines_up;
+ /* go to 1st column; go up */
+ printf("\r" "\033[%uA", lines_up);
+ /* go to correct column.
+ * xtarm, konsole, Linux VT interpret 0 as 1 below! wow.
+ * Need to *make sure* we skip it if cmdedit_x == 0 */
+ if (cmdedit_x)
+ printf("\033[%uC", cmdedit_x);
}
}