--- a/libpurple/trie.c Tue Mar 25 15:41:57 2014 +0100
+++ b/libpurple/trie.c Tue Mar 25 16:16:20 2014 +0100
@@ -73,14 +73,28 @@
******************************************************************************/
static PurpleTrieRecordList *
+purple_record_list_new(PurpleMemoryPool *mpool, PurpleTrieRecord *rec) + PurpleTrieRecordList *node; + node = purple_memory_pool_alloc(mpool, + sizeof(PurpleTrieRecordList), sizeof(gpointer)); + g_return_val_if_fail(node != NULL, NULL); +static PurpleTrieRecordList * purple_record_list_prepend(PurpleMemoryPool *mpool,
PurpleTrieRecordList *old_head, PurpleTrieRecord *rec)
PurpleTrieRecordList *new_head;
- new_head = purple_memory_pool_alloc(mpool,
- sizeof(PurpleTrieRecordList), sizeof(gpointer));
+ new_head = purple_record_list_new(mpool, rec); + g_return_val_if_fail(new_head != NULL, NULL); new_head->next = old_head;
old_head->prev = new_head;
@@ -88,6 +102,53 @@
+static PurpleTrieRecordList * +purple_record_list_copy(PurpleMemoryPool *mpool, + const PurpleTrieRecordList *head) + PurpleTrieRecordList *new_head = NULL, *new_tail = NULL; + PurpleTrieRecordList *node; + node = purple_record_list_new(mpool, head->rec); + g_return_val_if_fail(node != NULL, NULL); /* there is no leak */ +static PurpleTrieRecordList * +purple_record_list_remove(PurpleTrieRecordList *head, + PurpleTrieRecordList *node) + g_return_val_if_fail(head != NULL, NULL); + g_return_val_if_fail(node != NULL, head); + g_return_val_if_fail(head->prev == NULL, NULL); + if (head->next != NULL) + head->next->prev = NULL; + g_return_val_if_fail(node->prev != NULL, NULL); + node->prev->next = node->next; + if (node->next != NULL) + node->next->prev = node->prev; /*******************************************************************************
******************************************************************************/
@@ -146,6 +207,8 @@
PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie);
+ PurpleMemoryPool *reclist_mpool; + PurpleTrieRecordList *reclist; g_return_val_if_fail(priv != NULL, FALSE);
@@ -155,7 +218,13 @@
priv->root_state = root = purple_trie_state_new(trie, NULL, '\0');
g_return_val_if_fail(root != NULL, FALSE);
+ reclist_mpool = purple_memory_pool_new(); + reclist = purple_record_list_copy(reclist_mpool, priv->records); + /* test */ purple_record_list_remove(reclist, reclist->next); + g_object_unref(reclist_mpool);