src/llist.c: Compare data pointers if callback is NULL

If a NULL callback is passed to llist_find_*(), fall back to comparing
data pointers. The check for a NULL callback pointer is done outside the
main loop with an eye towards performance.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2012-06-26 10:49:46 +02:00
parent b8b6830dfd
commit e1fbee0071

View File

@ -210,9 +210,16 @@ llist_item_t *llist_find_first(llist_t * l, void *data,
{ {
llist_item_t *i; llist_item_t *i;
for (i = l->head; i; i = i->next) { if (fn_match) {
if (fn_match(i->data, data)) for (i = l->head; i; i = i->next) {
return i; if (fn_match(i->data, data))
return i;
}
} else {
for (i = l->head; i; i = i->next) {
if (i->data == data)
return i;
}
} }
return NULL; return NULL;
@ -226,9 +233,16 @@ llist_item_t *llist_find_next(llist_item_t * i, void *data,
{ {
if (i) { if (i) {
i = i->next; i = i->next;
for (; i; i = i->next) { if (fn_match) {
if (fn_match(i->data, data)) for (; i; i = i->next) {
return i; if (fn_match(i->data, data))
return i;
}
} else {
for (; i; i = i->next) {
if (i->data == data)
return i;
}
} }
} }
@ -246,9 +260,16 @@ llist_item_t *llist_find_nth(llist_t * l, int n, void *data,
if (n < 0) if (n < 0)
return NULL; return NULL;
for (i = l->head; i; i = i->next) { if (fn_match) {
if (fn_match(i->data, data) && (n-- == 0)) for (i = l->head; i; i = i->next) {
return i; if (fn_match(i->data, data) && (n-- == 0))
return i;
}
} else {
for (i = l->head; i; i = i->next) {
if ((i->data == data) && (n-- == 0))
return i;
}
} }
return NULL; return NULL;