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>
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 @@
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);
}
}