Mercurial > pidgin
changeset 16806:10f175539cfe
Change a few functions to free a linked list while iterating through
it instead of after iterating through it. This is probably a very
tiny bit faster, but more importantly, I think the code is easier to
read
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 03 May 2007 07:55:32 +0000 |
parents | 04fecd1ee64d |
children | f7466b0379e8 |
files | libpurple/buddyicon.c libpurple/connection.c libpurple/privacy.c libpurple/server.c |
diffstat | 4 files changed, 24 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/buddyicon.c Thu May 03 07:51:51 2007 +0000 +++ b/libpurple/buddyicon.c Thu May 03 07:55:32 2007 +0000 @@ -372,7 +372,7 @@ PurpleAccount *account; const char *username; PurpleBuddyIcon *icon_to_set; - GSList *sl, *list; + GSList *buddies; g_return_if_fail(icon != NULL); @@ -386,11 +386,10 @@ * the icon when they realize it has no data. */ icon_to_set = icon->img ? icon : NULL; - for (list = sl = purple_find_buddies(account, username); - sl != NULL; - sl = sl->next) + buddies = purple_find_buddies(account, username); + while (buddies != NULL) { - PurpleBuddy *buddy = (PurpleBuddy *)sl->data; + PurpleBuddy *buddy = (PurpleBuddy *)buddies->data; char *old_icon; purple_buddy_set_icon(buddy, icon_to_set); @@ -425,10 +424,10 @@ } unref_filename(old_icon); g_free(old_icon); + + buddies = g_slist_delete_link(buddies, buddies); } - g_slist_free(list); - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, username, account); if (conv != NULL)
--- a/libpurple/connection.c Thu May 03 07:51:51 2007 +0000 +++ b/libpurple/connection.c Thu May 03 07:55:32 2007 +0000 @@ -161,7 +161,7 @@ purple_connection_destroy(PurpleConnection *gc) { PurpleAccount *account; - GSList *buddies, *tmp; + GSList *buddies; #if 0 GList *wins; #endif @@ -197,11 +197,11 @@ /* Clear out the proto data that was freed in the prpl close method*/ buddies = purple_find_buddies(account, NULL); - for (tmp = buddies; tmp; tmp = tmp->next) { - PurpleBuddy *buddy = tmp->data; + while (buddies != NULL) { + PurpleBuddy *buddy = buddies->data; buddy->proto_data = NULL; + buddies = g_slist_delete_link(buddies, buddies); } - g_slist_free(buddies); connections = g_list_remove(connections, gc);
--- a/libpurple/privacy.c Thu May 03 07:51:51 2007 +0000 +++ b/libpurple/privacy.c Thu May 03 07:55:32 2007 +0000 @@ -206,7 +206,8 @@ static void add_buddies_in_permit(PurpleAccount *account, gboolean local) { - GSList *list, *iter; + GSList *list; + /* Remove anyone in the permit list who is not in the buddylist */ for (list = account->permit; list != NULL; ) { char *person = list->data; @@ -214,13 +215,16 @@ if (!purple_find_buddy(account, person)) purple_privacy_permit_remove(account, person, local); } + /* Now make sure everyone in the buddylist is in the permit list */ - for (iter = list = purple_find_buddies(account, NULL); iter; iter = iter->next) { - PurpleBuddy *buddy = iter->data; + list = purple_find_buddies(account, NULL); + while (list != NULL) + { + PurpleBuddy *buddy = list->data; if (!g_slist_find_custom(account->permit, buddy->name, (GCompareFunc)g_utf8_collate)) purple_privacy_permit_add(account, buddy->name, local); + list = g_slist_delete_link(list, list); } - g_slist_free(list); } void
--- a/libpurple/server.c Thu May 03 07:51:51 2007 +0000 +++ b/libpurple/server.c Thu May 03 07:55:32 2007 +0000 @@ -210,22 +210,24 @@ serv_got_alias(PurpleConnection *gc, const char *who, const char *alias) { PurpleAccount *account = purple_connection_get_account(gc); - GSList *buds, *buddies = purple_find_buddies(account, who); + GSList *buddies = purple_find_buddies(account, who); PurpleBuddy *b; PurpleConversation *conv; - for (buds = buddies; buds; buds = buds->next) + while (buddies != NULL) { - b = buds->data; + b = buddies->data; + buddies = g_slist_delete_link(buddies, buddies); + if ((b->server_alias == NULL && alias == NULL) || (b->server_alias && alias && !strcmp(b->server_alias, alias))) { continue; } + purple_blist_server_alias_buddy(b, alias); conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, b->name, account); - if (conv != NULL && alias != NULL && strcmp(alias, who)) { char *tmp = g_strdup_printf(_("%s is now known as %s.\n"), @@ -237,7 +239,6 @@ g_free(tmp); } } - g_slist_free(buddies); } /*