#include "linklist.h"
#include "memory.h"
+#include "libfrr_trace.h"
-DEFINE_MTYPE_STATIC(LIB, LINK_LIST, "Link List")
-DEFINE_MTYPE_STATIC(LIB, LINK_NODE, "Link Node")
+DEFINE_MTYPE_STATIC(LIB, LINK_LIST, "Link List");
+DEFINE_MTYPE_STATIC(LIB, LINK_NODE, "Link Node");
struct list *list_new(void)
{
struct listnode *listnode_add(struct list *list, void *val)
{
+ frrtrace(2, frr_libfrr, list_add, list, val);
+
struct listnode *node;
assert(val != NULL);
return true;
}
+struct list *list_dup(struct list *list)
+{
+ struct list *dup;
+ struct listnode *node;
+ void *data;
+
+ assert(list);
+
+ dup = list_new();
+ dup->cmp = list->cmp;
+ dup->del = list->del;
+ for (ALL_LIST_ELEMENTS_RO(list, node, data))
+ listnode_add(dup, data);
+
+ return dup;
+}
+
void listnode_add_sort(struct list *list, void *val)
{
struct listnode *n;
void listnode_delete(struct list *list, const void *val)
{
+ frrtrace(2, frr_libfrr, list_remove, list, val);
+
struct listnode *node = listnode_lookup(list, val);
if (node)
list->count = 0;
}
-void list_filter_out_nodes(struct list *list, bool (*cond)(void *data))
-{
- struct listnode *node;
- struct listnode *next;
- void *data;
-
- assert(list);
-
- for (ALL_LIST_ELEMENTS(list, node, next, data)) {
- if ((cond && cond(data)) || (!cond)) {
- if (*list->del)
- (*list->del)(data);
- list_delete_node(list, node);
- }
- }
-}
-
void list_delete(struct list **list)
{
assert(*list);
void list_delete_node(struct list *list, struct listnode *node)
{
+ frrtrace(2, frr_libfrr, list_delete_node, list, node);
+
if (node->prev)
node->prev->next = node->next;
else
void list_sort(struct list *list, int (*cmp)(const void **, const void **))
{
+ frrtrace(1, frr_libfrr, list_sort, list);
+
struct listnode *ln, *nn;
int i = -1;
void *data;