[PATCH 1/4] ed: newly joined lines are placed correctly

From: Thomas Mannay <audiobarrier_AT_openmailbox.org>
Date: Thu, 6 Oct 2016 10:46:14 +0000

---
 ed.c | 49 +++++++++++++++++++++++++++----------------------
 1 file changed, 27 insertions(+), 22 deletions(-)
diff --git a/ed.c b/ed.c
index 184ed30..2a1c0ba 100644
--- a/ed.c
+++ b/ed.c
_AT_@ -297,13 +297,17 @@ undo(void)
 }
 
 static void
-inject(char *s)
+inject(char *s, int join)
 {
 	int off, k, begin, end;
 
-	begin = getindex(curln);
-	end = getindex(nextln(curln));
-
+	if (join) {
+		begin = getindex(curln-1);
+		end = getindex(nextln(curln-1));
+	} else {
+		begin = getindex(curln);
+		end = getindex(nextln(curln));
+	}
 	while (*s) {
 		k = makeline(s, &off);
 		s += off;
_AT_@ -634,7 +638,7 @@ doread(char *fname)
 			s[n-1] = '\n';
 			s[n] = '\0';
 		}
-		inject(s);
+		inject(s, 0);
 	}
 	if (optdiag)
 		printf("%zu\n", cnt);
_AT_@ -751,7 +755,7 @@ append(int num)
 	while (getline(&s, &len, stdin) > 0) {
 		if (*s == '.' && s[1] == '\n')
 			break;
-		inject(s);
+		inject(s, 0);
 	}
 	free(s);
 }
_AT_@ -801,21 +805,22 @@ static void
 join(void)
 {
 	int i;
-	char *t, c;
-	size_t len = 0, cap = 0;
-	static char *s;
+        char *t, c;
+        size_t len = 0, cap = 0;
+        static char *s;
+
+        free(s);
+        for (s = NULL, i = line1; i <= line2; i = nextln(i)) {
+                for (t = gettxt(i); (c = *t) != '\n'; ++t)
+                        s = addchar(*t, s, &cap, &len);
+        }
+
+        s = addchar('\n', s, &cap, &len);
+        s = addchar('\0', s, &cap, &len);
+        delete(line1, line2);
+        inject(s);
+        free(s);
 
-	free(s);
-	for (s = NULL, i = line1; i <= line2; i = nextln(i)) {
-		for (t = gettxt(i); (c = *t) != '\n'; ++t)
-			s = addchar(*t, s, &cap, &len);
-	}
-
-	s = addchar('\n', s, &cap, &len);
-	s = addchar('\0', s, &cap, &len);
-	delete(line1, line2);
-	inject(s);
-	free(s);
 }
 
 static void
_AT_@ -841,7 +846,7 @@ copy(int where)
 	curln = where;
 
 	for (i = line1; i <= line2; ++i)
-		inject(gettxt(i));
+		inject(gettxt(i), 0);
 }
 
 static void
_AT_@ -1021,7 +1026,7 @@ subline(int num, int nth)
 	addpost(&s, &cap, &siz);
 	delete(num, num);
 	curln = prevln(num);
-	inject(s);
+	inject(s, 0);
 }
static void
-- 
2.10.0
--Multipart=_Thu__6_Oct_2016_11_04_17_+0000_25tL/22NlhexcG.a
Content-Type: text/x-patch;
 name="0002-ed-if-only-one-address-is-given-to-j-do-nothing.patch"
Content-Disposition: attachment;
 filename="0002-ed-if-only-one-address-is-given-to-j-do-nothing.patch"
Content-Transfer-Encoding: 7bit
Received on Mon Sep 17 2001 - 00:00:00 CEST

This archive was generated by hypermail 2.3.0 : Fri Oct 07 2016 - 06:24:11 CEST