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>maint
parent
97fc6c5fba
commit
1a41e743c6
|
@ -127,38 +127,6 @@ inline struct llist_item * llist_insert_sorted_unique(struct llist *list,
|
||||||
return llist_insert_back(list, sha1);
|
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 */
|
/* returns a pointer to an item in front of sha1 */
|
||||||
inline struct llist_item * llist_sorted_remove(struct llist *list, char *sha1,
|
inline struct llist_item * llist_sorted_remove(struct llist *list, char *sha1,
|
||||||
struct llist_item *hint)
|
struct llist_item *hint)
|
||||||
|
@ -194,6 +162,21 @@ redo_from_start:
|
||||||
return prev;
|
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,
|
inline struct pack_list * pack_list_insert(struct pack_list **pl,
|
||||||
struct pack_list *entry)
|
struct pack_list *entry)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue