[git commit] ed: fix line insertion before current line. Closes 15081
Denys Vlasenko
vda.linux at googlemail.com
Fri Sep 27 18:14:04 UTC 2024
commit: https://git.busybox.net/busybox/commit/?id=26895db35d4b9160ff5f2fe1f942e1ddbf58747d
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master
When text is inserted by insertLine() the lines following the
insertion are moved down and the insertion point is made the new
current line. To avoid too much scanning of the linked list of
lines setCurNum() may use the position of the old current line to
determine the location of the new current line.
If the insertion point is before the old current line in the file
the latter will have been moved down, so its line pointer needs to
be adjusted.
function old new delta
insertLine 162 180 +18
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 18/0) Total: 18 bytes
Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
editors/ed.c | 2 ++
testsuite/ed.tests | 21 +++++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/editors/ed.c b/editors/ed.c
index 8ec23d07f..a02634ec7 100644
--- a/editors/ed.c
+++ b/editors/ed.c
@@ -345,6 +345,8 @@ static int insertLine(int num, const char *data, int len)
lp->prev->next = newLp;
lp->prev = newLp;
+ if (num <= curNum)
+ curLine = curLine->prev;
lastNum++;
dirty = TRUE;
return setCurNum(num);
diff --git a/testsuite/ed.tests b/testsuite/ed.tests
new file mode 100755
index 000000000..475fdc244
--- /dev/null
+++ b/testsuite/ed.tests
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+. ./testing.sh
+
+# testing "test name" "command" "expected result" "file input" "stdin"
+
+testing "ed insert text before current line" \
+ "ed input" "8\n1\ntext\n2\n3\n4\n13\n" "1\n2\n3\n4\n" '2i
+text
+.
+,p
+w
+q
+'
+
+testing "ed read text before current line" \
+ "ed input" "8\n8\n1\n2\n1\n2\n3\n4\n3\n4\n16\n" "1\n2\n3\n4\n" '2r input
+,p
+w
+q
+'
More information about the busybox-cvs
mailing list