diff options
author | Lukas Sandström <lukass@etek.chalmers.se> | 2005-11-15 22:24:02 +0100 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-11-15 21:19:56 -0800 |
commit | 1a41e743c6270a24daca7309ef3d9ef74543d8ae (patch) | |
tree | 9c4255376f9999de255c4153494fa8e464eecce2 /pack-redundant.c | |
parent | 97fc6c5fbacc2181319bbd7e2faa8ac04476f862 (diff) | |
download | git-1a41e743c6270a24daca7309ef3d9ef74543d8ae.tar.gz |
Fix llist_sorted_difference_inplace in git-pack-redundant
Simplify and actually make llist_sorted_difference_inplace work
by using llist_sorted_remove instead of duplicating parts of the
code.
Signed-off-by: Lukas Sandström <lukass@etek.chalmers.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'pack-redundant.c')
-rw-r--r-- | pack-redundant.c | 47 |
1 files changed, 15 insertions, 32 deletions
diff --git a/pack-redundant.c b/pack-redundant.c index 28b82ee65a..fcb36ff901 100644 --- a/pack-redundant.c +++ b/pack-redundant.c @@ -127,38 +127,6 @@ inline struct llist_item * llist_insert_sorted_unique(struct llist *list, return llist_insert_back(list, sha1); } -/* computes A\B */ -void llist_sorted_difference_inplace(struct llist *A, - struct llist *B) -{ - struct llist_item *prev, *a, *b, *x; - - prev = a = A->front; - b = B->front; - - while (a != NULL && b != NULL) { - int cmp = memcmp(a->sha1, b->sha1, 20); - if (!cmp) { - x = a; - if (a == A->front) - A->front = a->next; - a = prev->next = a->next; - - if (a == NULL) /* end of list */ - A->back = prev; - A->size--; - free(x); - b = b->next; - } else - if (cmp > 0) - b = b->next; - else { - prev = a; - a = a->next; - } - } -} - /* returns a pointer to an item in front of sha1 */ inline struct llist_item * llist_sorted_remove(struct llist *list, char *sha1, struct llist_item *hint) @@ -194,6 +162,21 @@ redo_from_start: return prev; } +/* computes A\B */ +void llist_sorted_difference_inplace(struct llist *A, + struct llist *B) +{ + struct llist_item *hint, *b; + + hint = NULL; + b = B->front; + + while (b) { + hint = llist_sorted_remove(A, b->sha1, hint); + b = b->next; + } +} + inline struct pack_list * pack_list_insert(struct pack_list **pl, struct pack_list *entry) { |