summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Sandström <lukass@etek.chalmers.se>2005-11-15 21:24:02 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-11-16 05:19:56 (GMT)
commit1a41e743c6270a24daca7309ef3d9ef74543d8ae (patch)
tree9c4255376f9999de255c4153494fa8e464eecce2
parent97fc6c5fbacc2181319bbd7e2faa8ac04476f862 (diff)
downloadgit-1a41e743c6270a24daca7309ef3d9ef74543d8ae.zip
git-1a41e743c6270a24daca7309ef3d9ef74543d8ae.tar.gz
git-1a41e743c6270a24daca7309ef3d9ef74543d8ae.tar.bz2
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>
-rw-r--r--pack-redundant.c47
1 files changed, 15 insertions, 32 deletions
diff --git a/pack-redundant.c b/pack-redundant.c
index 28b82ee..fcb36ff 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)
{