The sorted-array API splits search and insert into two separated functions, which makes the caller code more clear. Signed-off-by: Yann Dirson <ydirson@xxxxxxxxxx> --- diffcore-rename.c | 62 ++++++++++++++++++----------------------------------- 1 files changed, 21 insertions(+), 41 deletions(-) diff --git a/diffcore-rename.c b/diffcore-rename.c index df41be5..ca3f54c 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -5,52 +5,32 @@ #include "diff.h" #include "diffcore.h" #include "hash.h" +#include "sorted-array.h" /* Table of rename/copy destinations */ -static struct diff_rename_dst { +struct diff_rename_dst { struct diff_filespec *two; struct diff_filepair *pair; -} *rename_dst; -static int rename_dst_nr, rename_dst_alloc; +}; -static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two, - int insert_ok) +static int rename_dst_cmp(struct diff_filespec *ref_spec, struct diff_rename_dst *elem) { - int first, last; - - first = 0; - last = rename_dst_nr; - while (last > first) { - int next = (last + first) >> 1; - struct diff_rename_dst *dst = &(rename_dst[next]); - int cmp = strcmp(two->path, dst->two->path); - if (!cmp) - return dst; - if (cmp < 0) { - last = next; - continue; - } - first = next+1; - } - /* not found */ - if (!insert_ok) - return NULL; - /* insert to make it at "first" */ - if (rename_dst_alloc <= rename_dst_nr) { - rename_dst_alloc = alloc_nr(rename_dst_alloc); - rename_dst = xrealloc(rename_dst, - rename_dst_alloc * sizeof(*rename_dst)); - } - rename_dst_nr++; - if (first < rename_dst_nr) - memmove(rename_dst + first + 1, rename_dst + first, - (rename_dst_nr - first - 1) * sizeof(*rename_dst)); - rename_dst[first].two = alloc_filespec(two->path); - fill_filespec(rename_dst[first].two, two->sha1, two->mode); - rename_dst[first].pair = NULL; - return &(rename_dst[first]); + return strcmp(ref_spec->path, elem->two->path); +} +static void rename_dst_init(struct diff_rename_dst *elem, struct diff_filespec *ref_spec) +{ + elem->two = alloc_filespec(ref_spec->path); + fill_filespec(elem->two, ref_spec->sha1, ref_spec->mode); + elem->pair = NULL; } +declare_sorted_array(static, struct diff_rename_dst, rename_dst); +declare_sorted_array_search_elem(static, struct diff_rename_dst, locate_rename_dst, + struct diff_filespec *, + rename_dst, rename_dst_cmp); +declare_sorted_array_insert_checkbool(static, struct diff_rename_dst, register_rename_dst, + struct diff_filespec *, _gen_locate_rename_dst, + rename_dst, rename_dst_cmp, rename_dst_init); /* Table of rename/copy src files */ static struct diff_rename_src { @@ -437,7 +417,7 @@ void diffcore_rename(struct diff_options *options) strcmp(options->single_follow, p->two->path)) continue; /* not interested */ else - locate_rename_dst(p->two, 1); + register_rename_dst(p->two); } else if (!DIFF_FILE_VALID(p->two)) { /* @@ -582,7 +562,7 @@ void diffcore_rename(struct diff_options *options) * not been turned into a rename/copy already. */ struct diff_rename_dst *dst = - locate_rename_dst(p->two, 0); + locate_rename_dst(p->two); if (dst && dst->pair) { diff_q(&outq, dst->pair); pair_to_free = p; @@ -613,7 +593,7 @@ void diffcore_rename(struct diff_options *options) if (DIFF_PAIR_BROKEN(p)) { /* broken delete */ struct diff_rename_dst *dst = - locate_rename_dst(p->one, 0); + locate_rename_dst(p->one); if (dst && dst->pair) /* counterpart is now rename/copy */ pair_to_free = p; -- 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