|
|
|
@ -10,7 +10,7 @@ static unsigned int contains(struct diff_filespec *one,
@@ -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; |
|
|
|
@ -33,15 +33,13 @@ static unsigned int contains(struct diff_filespec *one,
@@ -33,15 +33,13 @@ static unsigned int contains(struct diff_filespec *one,
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} 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); |
|
|
|
|