summaryrefslogtreecommitdiffstats
path: root/src/llist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/llist.c')
-rw-r--r--src/llist.c211
1 files changed, 105 insertions, 106 deletions
diff --git a/src/llist.c b/src/llist.c
index eeded6b..847b795 100644
--- a/src/llist.c
+++ b/src/llist.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2011 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2012 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -39,52 +39,47 @@
/*
* Initialize a list.
*/
-void
-llist_init (llist_t *l)
+void llist_init(llist_t * l)
{
l->head = NULL;
+ l->tail = NULL;
}
/*
* Free a list, but not the contained data.
*/
-void
-llist_free (llist_t *l)
+void llist_free(llist_t * l)
{
llist_item_t *i, *t;
- for (i = l->head; i; i = t)
- {
- t = i->next;
- mem_free (i);
- }
+ for (i = l->head; i; i = t) {
+ t = i->next;
+ mem_free(i);
+ }
l->head = NULL;
+ l->tail = NULL;
}
/*
* Free the data contained in a list.
*/
-void
-llist_free_inner (llist_t *l, llist_fn_free_t fn_free)
+void llist_free_inner(llist_t * l, llist_fn_free_t fn_free)
{
llist_item_t *i;
- for (i = l->head; i; i = i->next)
- {
- if (i->data)
- {
- fn_free(i->data);
- i->data = NULL;
- }
+ for (i = l->head; i; i = i->next) {
+ if (i->data) {
+ fn_free(i->data);
+ i->data = NULL;
}
+ }
}
/*
* Get the first item of a list.
*/
-llist_item_t *
-llist_first (llist_t *l)
+llist_item_t *llist_first(llist_t * l)
{
return l->head;
}
@@ -92,12 +87,14 @@ llist_first (llist_t *l)
/*
* Get the nth item of a list.
*/
-llist_item_t *
-llist_nth (llist_t *l, int n)
+llist_item_t *llist_nth(llist_t * l, int n)
{
llist_item_t *i;
- for (i = l->head; i && n > 0; n--)
+ if (n < 0)
+ return NULL;
+
+ for (i = l->head; i && n != 0; n--)
i = i->next;
return i;
@@ -106,17 +103,28 @@ llist_nth (llist_t *l, int n)
/*
* Get the successor of a list item.
*/
-llist_item_t *
-llist_next (llist_item_t *i)
+llist_item_t *llist_next(llist_item_t * i)
{
return i ? i->next : NULL;
}
/*
+ * Return the successor of a list item if it is matched by some filter
+ * callback. Return NULL otherwise.
+ */
+llist_item_t *llist_next_filter(llist_item_t * i, long data,
+ llist_fn_match_t fn_match)
+{
+ if (i && i->next && fn_match(i->next->data, data))
+ return i->next;
+ else
+ return NULL;
+}
+
+/*
* Get the actual data of an item.
*/
-void *
-llist_get_data (llist_item_t *i)
+void *llist_get_data(llist_item_t * i)
{
return i ? i->data : NULL;
}
@@ -124,97 +132,88 @@ llist_get_data (llist_item_t *i)
/*
* Add an item at the end of a list.
*/
-void
-llist_add (llist_t *l, void *data)
+void llist_add(llist_t * l, void *data)
{
- llist_item_t *o = mem_malloc (sizeof (llist_item_t));
- llist_item_t *i;
+ llist_item_t *o = mem_malloc(sizeof(llist_item_t));
- if (o)
- {
- o->data = data;
- o->next = NULL;
-
- if (!l->head)
- l->head = o;
- else
- {
- for (i = l->head; i->next; i = i->next)
- ;
- i->next = o;
- }
+ if (o) {
+ o->data = data;
+ o->next = NULL;
+
+ if (!l->head)
+ l->head = l->tail = o;
+ else {
+ l->tail->next = o;
+ l->tail = o;
}
+ }
}
/*
* Add an item to a sorted list.
*/
-void
-llist_add_sorted (llist_t *l, void *data, llist_fn_cmp_t fn_cmp)
+void llist_add_sorted(llist_t * l, void *data, llist_fn_cmp_t fn_cmp)
{
- llist_item_t *o = mem_malloc (sizeof (llist_item_t));
+ llist_item_t *o = mem_malloc(sizeof(llist_item_t));
llist_item_t *i;
- if (o)
- {
- o->data = data;
- o->next = NULL;
-
- if (!l->head)
- l->head = o;
- else if (fn_cmp(o->data, l->head->data) < 0)
- {
- o->next = l->head;
- l->head = o;
- }
- else
- {
- i = l->head;
- while (i->next && fn_cmp(o->data, i->next->data) >= 0)
- i = i->next;
- o->next = i->next;
- i->next = o;
- }
+ if (o) {
+ o->data = data;
+ o->next = NULL;
+
+ if (!l->head)
+ l->head = l->tail = o;
+ else if (fn_cmp(o->data, l->tail->data) >= 0) {
+ l->tail->next = o;
+ l->tail = o;
+ } else if (fn_cmp(o->data, l->head->data) < 0) {
+ o->next = l->head;
+ l->head = o;
+ } else {
+ i = l->head;
+ while (i->next && fn_cmp(o->data, i->next->data) >= 0)
+ i = i->next;
+ o->next = i->next;
+ i->next = o;
}
+ }
}
/*
* Remove an item from a list.
*/
-void
-llist_remove (llist_t *l, llist_item_t *i)
+void llist_remove(llist_t * l, llist_item_t * i)
{
llist_item_t *j = NULL;
if (l->head && i == l->head)
l->head = i->next;
- else
- {
- for (j = l->head; j && j->next != i; j = j->next)
- ;
- }
-
- if (i)
- {
- if (j)
- j->next = i->next;
- mem_free (i);
- }
+ else {
+ for (j = l->head; j && j->next != i; j = j->next) ;
+ }
+
+ if (i) {
+ if (j)
+ j->next = i->next;
+ if (i == l->tail)
+ l->tail = j;
+
+ mem_free(i);
+ }
}
/*
* Find the first item matched by some filter callback.
*/
-llist_item_t *
-llist_find_first (llist_t *l, long data, llist_fn_match_t fn_match)
+llist_item_t *llist_find_first(llist_t * l, long data,
+ llist_fn_match_t fn_match)
{
llist_item_t *i;
- for (i = l->head; i; i = i->next)
- {
- if (fn_match (i->data, data))
- return i;
- }
+ for (i = l->head; i; i = i->next) {
+ if (fn_match(i->data, data))
+ return i;
+ }
return NULL;
}
@@ -222,18 +221,16 @@ llist_find_first (llist_t *l, long data, llist_fn_match_t fn_match)
/*
* Find the next item matched by some filter callback.
*/
-llist_item_t *
-llist_find_next (llist_item_t *i, long data, llist_fn_match_t fn_match)
+llist_item_t *llist_find_next(llist_item_t * i, long data,
+ llist_fn_match_t fn_match)
{
- if (i)
- {
- i = i->next;
- for (; i; i = i->next)
- {
- if (fn_match (i->data, data))
- return i;
- }
+ if (i) {
+ i = i->next;
+ for (; i; i = i->next) {
+ if (fn_match(i->data, data))
+ return i;
}
+ }
return NULL;
}
@@ -241,16 +238,18 @@ llist_find_next (llist_item_t *i, long data, llist_fn_match_t fn_match)
/*
* Find the nth item matched by some filter callback.
*/
-llist_item_t *
-llist_find_nth (llist_t *l, int n, long data, llist_fn_match_t fn_match)
+llist_item_t *llist_find_nth(llist_t * l, int n, long data,
+ llist_fn_match_t fn_match)
{
llist_item_t *i;
- for (i = l->head; i; i = i->next)
- {
- if (fn_match (i->data, data) && (n-- == 0))
- return i;
- }
+ if (n < 0)
+ return NULL;
+
+ for (i = l->head; i; i = i->next) {
+ if (fn_match(i->data, data) && (n-- == 0))
+ return i;
+ }
return NULL;
}