[PATCH 07/15] ref_remove_duplicates(): simplify function
* Use a dedicated variable, ref, for referring to the current item
rather than using the ref_map pointer for this purpose.
* Use a (struct ref **) as iteration variable to avoid having to keep
track of prev and next in addition to the pointer to the current
item.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
remote.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/remote.c b/remote.c
index a44e897..5ade07f 100644
--- a/remote.c
+++ b/remote.c
@@ -748,29 +748,33 @@ int for_each_remote(each_remote_fn fn, void *priv)
void ref_remove_duplicates(struct ref *ref_map)
{
struct string_list refs = STRING_LIST_INIT_NODUP;
- struct string_list_item *item = NULL;
- struct ref *prev = NULL, *next = NULL;
+ struct ref **p;
- for (; ref_map; prev = ref_map, ref_map = next) {
- next = ref_map->next;
- if (!ref_map->peer_ref)
+ for (p = &ref_map; *p; ) {
+ struct ref *ref = *p;
+ struct string_list_item *item;
+
+ if (!ref->peer_ref) {
+ p = &ref->next;
continue;
+ }
- item = string_list_insert(&refs, ref_map->peer_ref->name);
+ item = string_list_insert(&refs, ref->peer_ref->name);
if (item->util) {
/* Entry already existed */
if (strcmp(((struct ref *)item->util)->name,
- ref_map->name))
+ ref->name))
die("%s tracks both %s and %s",
- ref_map->peer_ref->name,
+ ref->peer_ref->name,
((struct ref *)item->util)->name,
- ref_map->name);
- prev->next = ref_map->next;
- free(ref_map->peer_ref);
- free(ref_map);
- ref_map = prev; /* skip this; we freed it */
+ ref->name);
+ /* item is a duplicate; remove and free it */
+ *p = ref->next;
+ free(ref->peer_ref);
+ free(ref);
} else {
- item->util = ref_map;
+ item->util = ref;
+ p = &ref->next;
}
}
string_list_clear(&refs, 0);
--
1.8.4