From: Lukas Sandström Date: Tue, 15 Nov 2005 21:24:02 +0000 (+0100) Subject: Fix llist_sorted_difference_inplace in git-pack-redundant X-Git-Tag: v0.99.9k~3^2~18 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=1a41e743c6270a24daca7309ef3d9ef74543d8ae;p=git.git 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 Signed-off-by: Junio C Hamano --- diff --git a/pack-redundant.c b/pack-redundant.c index 28b82ee6..fcb36ff9 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) {