diff options
Diffstat (limited to 'dbus/dbus-list.c')
-rw-r--r-- | dbus/dbus-list.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/dbus/dbus-list.c b/dbus/dbus-list.c index 31e5ae3f..c36246cb 100644 --- a/dbus/dbus-list.c +++ b/dbus/dbus-list.c @@ -133,7 +133,7 @@ link_after (DBusList **list, * while (link != NULL) * { * printf ("value is %p\n", link->data); - * link = _dbus_list_get_next_link (&list); + * link = _dbus_list_get_next_link (&link); * } * @endcode * @@ -155,7 +155,7 @@ link_after (DBusList **list, * while (link != NULL) * { * printf ("value is %p\n", link->data); - * link = _dbus_list_get_prev_link (&list); + * link = _dbus_list_get_prev_link (&link); * } * @endcode * @@ -301,6 +301,37 @@ _dbus_list_remove (DBusList **list, } /** + * Removes a value from the list. Only removes the + * last value equal to the given data pointer, + * even if multiple values exist which match. + * This is a linear-time operation. + * + * @param list address of the list head. + * @param data the value to remove. + * @returns #TRUE if a value was found to remove. + */ +dbus_bool_t +_dbus_list_remove_last (DBusList **list, + void *data) +{ + DBusList *link; + + link = _dbus_list_get_last_link (list); + while (link != NULL) + { + if (link->data == data) + { + _dbus_list_remove_link (list, link); + return TRUE; + } + + link = _dbus_list_get_prev_link (list, link); + } + + return FALSE; +} + +/** * Removes a link from the list. This is a constant-time operation. * * @param list address of the list head. |