aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2024-07-18 15:01:22 +0100
committerRon Yorston <rmy@pobox.com>2024-07-18 15:02:54 +0100
commitb1813ca864ed04f28b8ae0121c913fbe16aab8ee (patch)
tree68113aa6c7e292425f1243919897070fa323d205
parente68706f141f9f30e8dfccb3c0fec480dc68dbd32 (diff)
downloadbusybox-w32-b1813ca864ed04f28b8ae0121c913fbe16aab8ee.tar.gz
busybox-w32-b1813ca864ed04f28b8ae0121c913fbe16aab8ee.tar.bz2
busybox-w32-b1813ca864ed04f28b8ae0121c913fbe16aab8ee.zip
ed: fix line insertion before current line
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. (GitHub issue #431)
-rw-r--r--editors/ed.c4
-rwxr-xr-xtestsuite/ed.tests21
2 files changed, 25 insertions, 0 deletions
diff --git a/editors/ed.c b/editors/ed.c
index 8ec23d07f..e25179ddc 100644
--- a/editors/ed.c
+++ b/editors/ed.c
@@ -345,6 +345,10 @@ static int insertLine(int num, const char *data, int len)
345 lp->prev->next = newLp; 345 lp->prev->next = newLp;
346 lp->prev = newLp; 346 lp->prev = newLp;
347 347
348#if ENABLE_PLATFORM_MINGW32
349 if (num <= curNum)
350 curLine = curLine->prev;
351#endif
348 lastNum++; 352 lastNum++;
349 dirty = TRUE; 353 dirty = TRUE;
350 return setCurNum(num); 354 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 @@
1#!/bin/sh
2
3. ./testing.sh
4
5# testing "test name" "command" "expected result" "file input" "stdin"
6
7testing "ed insert text before current line" \
8 "ed input" "8\n1\ntext\n2\n3\n4\n13\n" "1\n2\n3\n4\n" '2i
9text
10.
11,p
12w
13q
14'
15
16testing "ed read text before current line" \
17 "ed input" "8\n8\n1\n2\n1\n2\n3\n4\n3\n4\n16\n" "1\n2\n3\n4\n" '2r input
18,p
19w
20q
21'