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, ®match, 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