[PATCH 3/4] diffcore-pickaxe: further refactor count_match()

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

 



We separate out the part that prepares the blob data to be inspected and
the part that does the actual counting in the data.

Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx>
---
 diffcore-pickaxe.c |   46 +++++++++++++++++++++++++---------------------
 1 files changed, 25 insertions(+), 21 deletions(-)

diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index 007b39c..4a0dca1 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -5,22 +5,13 @@
 #include "diff.h"
 #include "diffcore.h"
 
-static unsigned int count_match(int one_or_more,
-				struct diff_filespec *one,
-				const char *needle, unsigned long len,
-				regex_t *regexp)
+static unsigned int count_match_internal(int one_or_more,
+					 const char *data, unsigned long sz,
+					 const char *needle, unsigned long len,
+					 regex_t *regexp)
 {
-	unsigned int cnt;
-	unsigned long offset, sz;
-	const char *data;
-	if (diff_populate_filespec(one, 0))
-		return 0;
-	if (!len)
-		return 0;
-
-	sz = one->size;
-	data = one->data;
-	cnt = 0;
+	unsigned int cnt = 0;
+	unsigned long offset;
 
 	if (regexp) {
 		regmatch_t regmatch;
@@ -29,16 +20,14 @@ static unsigned int count_match(int one_or_more,
 		while (*data && !regexec(regexp, data, 1, &regmatch, flags)) {
 			flags |= REG_NOTBOL;
 			data += regmatch.rm_so;
-			if (*data) data++;
+			if (*data)
+				data++;
 			cnt++;
 			if (one_or_more)
 				break;
 		}
-
-	} else { /* Classic exact string match */
-		/* Yes, I've heard of strstr(), but the thing is *data may
-		 * not be NUL terminated.  Sue me.
-		 */
+	} else {
+		/* data many not be NUL terminated; we cannot use strstr() */
 		for (offset = 0; offset + len <= sz; offset++) {
 			/* we count non-overlapping occurrences of needle */
 			if (!memcmp(needle, data + offset, len)) {
@@ -49,6 +38,21 @@ static unsigned int count_match(int one_or_more,
 			}
 		}
 	}
+	return cnt;
+}
+
+static unsigned int count_match(int one_or_more,
+				struct diff_filespec *one,
+				const char *needle, unsigned long len,
+				regex_t *regexp)
+{
+	unsigned int cnt;
+	if (diff_populate_filespec(one, 0))
+		return 0;
+	if (!len)
+		return 0;
+	cnt = count_match_internal(one_or_more, one->data, one->size,
+				   needle, len, regexp);
 	diff_free_filespec_data(one);
 	return cnt;
 }
-- 
1.6.2.rc2.91.gf9a36

--
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