[PATCH 2/2] Make builtin-rerere use of strbuf nicer and more efficient.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



memory is now reused across hunks.
---
 builtin-rerere.c |   43 ++++++++++++++++++-------------------------
 1 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/builtin-rerere.c b/builtin-rerere.c
index 58288f6..d331772 100644
--- a/builtin-rerere.c
+++ b/builtin-rerere.c
@@ -72,13 +72,9 @@ static int handle_file(const char *path,
 	SHA_CTX ctx;
 	char buf[1024];
 	int hunk = 0, hunk_no = 0;
-	struct strbuf minus, plus;
-	struct strbuf *one = &minus, *two = +
+	struct strbuf one, two;
 	FILE *f = fopen(path, "r");
-	FILE *out;
-
-	strbuf_init(&minus, 0);
-	strbuf_init(&plus,  0);
+	FILE *out = NULL;
 
 	if (!f)
 		return error("Could not open %s", path);
@@ -89,51 +85,48 @@ static int handle_file(const char *path,
 			fclose(f);
 			return error("Could not write %s", output);
 		}
-	} else
-		out = NULL;
+	}
 
 	if (sha1)
 		SHA1_Init(&ctx);
 
+	strbuf_init(&one, 0);
+	strbuf_init(&two,  0);
 	while (fgets(buf, sizeof(buf), f)) {
 		if (!prefixcmp(buf, "<<<<<<< "))
 			hunk = 1;
 		else if (!prefixcmp(buf, "======="))
 			hunk = 2;
 		else if (!prefixcmp(buf, ">>>>>>> ")) {
-			int one_is_longer = (one->len > two->len);
-			int common_len = one_is_longer ? two->len : one->len;
-			int cmp = memcmp(one->buf, two->buf, common_len);
+			int cmp = strbuf_cmp(&one, &two);
 
 			hunk_no++;
 			hunk = 0;
-			if ((cmp > 0) || ((cmp == 0) && one_is_longer)) {
-				struct strbuf *swap = one;
-				one = two;
-				two = swap;
+			if (cmp > 0) {
+				strbuf_swap(&one, &two);
 			}
 			if (out) {
 				fputs("<<<<<<<\n", out);
-				fwrite(one->buf, one->len, 1, out);
+				fwrite(one.buf, one.len, 1, out);
 				fputs("=======\n", out);
-				fwrite(two->buf, two->len, 1, out);
+				fwrite(two.buf, two.len, 1, out);
 				fputs(">>>>>>>\n", out);
 			}
 			if (sha1) {
-				SHA1_Update(&ctx, one->buf, one->len);
-				SHA1_Update(&ctx, "\0", 1);
-				SHA1_Update(&ctx, two->buf, two->len);
-				SHA1_Update(&ctx, "\0", 1);
+				SHA1_Update(&ctx, one.buf, one.len + 1);
+				SHA1_Update(&ctx, two.buf, two.len + 1);
 			}
-			strbuf_release(one);
-			strbuf_release(two);
+			strbuf_reset(&one);
+			strbuf_reset(&two);
 		} else if (hunk == 1)
-			strbuf_addstr(one, buf);
+			strbuf_addstr(&one, buf);
 		else if (hunk == 2)
-			strbuf_addstr(two, buf);
+			strbuf_addstr(&two, buf);
 		else if (out)
 			fputs(buf, out);
 	}
+	strbuf_release(&one);
+	strbuf_release(&two);
 
 	fclose(f);
 	if (out)
-- 
1.5.3.2.1067.g96579

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux