summaryrefslogtreecommitdiff
path: root/diffcore-pickaxe.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-12-18 00:27:59 -0800
committerJunio C Hamano <gitster@pobox.com>2011-12-18 00:28:16 -0800
commit03f94ae9f909952ed5a78917ab319a312889354b (patch)
tree0fd041e8b390bd0d2a960ae629d8e965d363de92 /diffcore-pickaxe.c
parent2c47789d817aaf745a5ce5d5f79619c634cc8566 (diff)
parent81b50f3ce40bfdd66e5d967bf82be001039a9a98 (diff)
downloadgit-jk/maint-strbuf-missing-init.tar.gz
Update jk/maint-strbuf-missing-init to builtin/ renamejk/maint-strbuf-missing-init
Diffstat (limited to 'diffcore-pickaxe.c')
-rw-r--r--diffcore-pickaxe.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index af9fffe6e8..d0ef839700 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -10,7 +10,7 @@ static unsigned int contains(struct diff_filespec *one,
regex_t *regexp)
{
unsigned int cnt;
- unsigned long offset, sz;
+ unsigned long sz;
const char *data;
if (diff_populate_filespec(one, 0))
return 0;
@@ -25,23 +25,23 @@ static unsigned int contains(struct diff_filespec *one,
regmatch_t regmatch;
int flags = 0;
+ assert(data[sz] == '\0');
while (*data && !regexec(regexp, data, 1, &regmatch, flags)) {
flags |= REG_NOTBOL;
- data += regmatch.rm_so;
- if (*data) data++;
+ data += regmatch.rm_eo;
+ if (*data && regmatch.rm_so == regmatch.rm_eo)
+ data++;
cnt++;
}
} else { /* Classic exact string match */
- /* Yes, I've heard of strstr(), but the thing is *data may
- * not be NUL terminated. Sue me.
- */
- for (offset = 0; offset + len <= sz; offset++) {
- /* we count non-overlapping occurrences of needle */
- if (!memcmp(needle, data + offset, len)) {
- offset += len - 1;
- cnt++;
- }
+ while (sz) {
+ const char *found = memmem(data, sz, needle, len);
+ if (!found)
+ break;
+ sz -= found - data + len;
+ data = found + len;
+ cnt++;
}
}
diff_free_filespec_data(one);