There was no compelling reason to pass separately two members of a single struct to the insert function. That's a happy coincidence. Signed-off-by: Yann Dirson <ydirson@xxxxxxxxxx> --- diffcore-rename.c | 57 ++++++++++++++++++---------------------------------- 1 files changed, 20 insertions(+), 37 deletions(-) diff --git a/diffcore-rename.c b/diffcore-rename.c index a655017..7e35a82 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -37,46 +37,29 @@ declare_sorted_array_insert_checkbool(static, register_rename_dst, struct diff_f rename_dst, rename_dst_cmp, rename_dst_init); /* Table of rename/copy src files */ -static struct diff_rename_src { + +struct diff_rename_src { struct diff_filespec *one; unsigned short score; /* to remember the break score */ -} *rename_src; -static int rename_src_nr, rename_src_alloc; +}; -static struct diff_rename_src *register_rename_src(struct diff_filespec *one, - unsigned short score) +static int rename_src_cmp(struct diff_filepair *ref_pair, struct diff_rename_src *elem) { - int first, last; - - first = 0; - last = rename_src_nr; - while (last > first) { - int next = (last + first) >> 1; - struct diff_rename_src *src = &(rename_src[next]); - int cmp = strcmp(one->path, src->one->path); - if (!cmp) - return src; - if (cmp < 0) { - last = next; - continue; - } - first = next+1; - } - - /* insert to make it at "first" */ - if (rename_src_alloc <= rename_src_nr) { - rename_src_alloc = alloc_nr(rename_src_alloc); - rename_src = xrealloc(rename_src, - rename_src_alloc * sizeof(*rename_src)); - } - rename_src_nr++; - if (first < rename_src_nr) - memmove(rename_src + first + 1, rename_src + first, - (rename_src_nr - first - 1) * sizeof(*rename_src)); - rename_src[first].one = one; - rename_src[first].score = score; - return &(rename_src[first]); + return strcmp(ref_pair->one->path, elem->one->path); +} +static void rename_src_init(struct diff_rename_src *elem, struct diff_filepair *ref_pair) +{ + elem->one = ref_pair->one; + elem->score = ref_pair->score; } +declare_sorted_array(static, struct diff_rename_src, rename_src); +declare_gen_binsearch(static, struct diff_rename_src, _locate_rename_src, + struct diff_filepair *); +declare_gen_sorted_insert(static, struct diff_rename_src, _register_rename_src, + _locate_rename_src, struct diff_filepair *); +declare_sorted_array_insert_checkbool(static, register_rename_src, struct diff_filepair *, + _register_rename_src, + rename_src, rename_src_cmp, rename_src_init); static int basename_same(struct diff_filespec *src, struct diff_filespec *dst) { @@ -433,7 +416,7 @@ void diffcore_rename(struct diff_options *options) */ if (p->broken_pair && !p->score) p->one->rename_used++; - register_rename_src(p->one, p->score); + register_rename_src(p); } else if (detect_rename == DIFF_DETECT_COPY) { /* @@ -441,7 +424,7 @@ void diffcore_rename(struct diff_options *options) * one, to indicate ourselves as a user. */ p->one->rename_used++; - register_rename_src(p->one, p->score); + register_rename_src(p); } } if (rename_dst_nr == 0 || rename_src_nr == 0) -- 1.7.2.3 -- 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