#include "dlist.h"
struct dlist {
- struct dlist *next;
- struct dlist *prev;
- void *data;
+ struct dlist *next;
+ struct dlist *prev;
+ void *data;
};
struct dlist *dlist_append(struct dlist *list, void *data)
{
- struct dlist *item;
+ struct dlist *item;
- item = malloc(sizeof(*item));
- if (!item) {
- return NULL;
- }
+ item = malloc(sizeof(*item));
+ if (!item) {
+ return NULL;
+ }
- item->next = NULL;
- item->data = data;
+ item->next = NULL;
+ item->data = data;
- if (!list) {
- item->prev = item;
+ if (!list) {
+ item->prev = item;
- list = item;
- } else {
- item->prev = list->prev;
- item->prev->next = item;
+ list = item;
+ } else {
+ item->prev = list->prev;
+ item->prev->next = item;
- list->prev = item;
- }
+ list->prev = item;
+ }
- assert(!list->prev->next && "item NEXT");
+ assert(!list->prev->next && "item NEXT");
- return list;
+ return list;
}
struct dlist *dlist_prepend(struct dlist *list, void *data)
{
- struct dlist *item;
+ struct dlist *item;
- item = malloc(sizeof(*item));
- if (!item) {
- return NULL;
- }
+ item = malloc(sizeof(*item));
+ if (!item) {
+ return NULL;
+ }
- if (!list) {
- item->prev = item;
- item->next = NULL;
- } else {
- item->prev = list->prev;
- list->prev = item;
- item->next = list;
- }
+ if (!list) {
+ item->prev = item;
+ item->next = NULL;
+ } else {
+ item->prev = list->prev;
+ list->prev = item;
+ item->next = list;
+ }
- return item;
+ return item;
}
struct dlist *dlist_remove(struct dlist *list, struct dlist *l)
{
- if (!list || !l) {
- return NULL;
- }
+ if (!list || !l) {
+ return NULL;
+ }
- if (l == list) {
- l->prev = list->prev;
- list = l->next;
- } else {
- l->prev->next = l->next;
- }
+ if (l == list) {
+ l->prev = list->prev;
+ list = l->next;
+ } else {
+ l->prev->next = l->next;
+ }
- if (l->next) {
- l->next->prev = l->prev;
- }
+ if (l->next) {
+ l->next->prev = l->prev;
+ }
- free(l);
- return list;
+ free(l);
+ return list;
}
struct dlist *dlist_find_data(struct dlist *list, void *data)
{
- struct dlist *l;
- void *_data;
+ struct dlist *l;
+ void *_data;
- dlist_foreach(list, l, _data) {
- if (data == _data) {
- return l;
- }
+ dlist_foreach(list, l, _data) {
+ if (data == _data) {
+ return l;
}
+ }
- return NULL;
+ return NULL;
}
void *dlist_data(struct dlist *l)
{
- return l ? l->data : NULL;
+ return l ? l->data : NULL;
}
struct dlist *dlist_next(struct dlist *l)
{
- return l ? l->next : NULL;
+ return l ? l->next : NULL;
}
struct dlist *dlist_prev(struct dlist *l)
{
- return l ? l->prev : NULL;
+ return l ? l->prev : NULL;
}
int dlist_count(struct dlist *l)
{
- register int i;
- struct dlist *n;
- void *data;
+ register int i;
+ struct dlist *n;
+ void *data;
- i = 0;
- dlist_foreach(l, n, data) {
- i++;
- }
+ i = 0;
+ dlist_foreach(l, n, data) {
+ i++;
+ }
- return i;
+ return i;
}
struct dlist *dlist_nth(struct dlist *l, int nth)
{
- register int i;
- struct dlist *n;
- void *data;
-
- i = 0;
- dlist_foreach(l, n, data) {
- if (i == nth) {
- return l;
- }
-
- i++;
+ register int i;
+ struct dlist *n;
+ void *data;
+
+ i = 0;
+ dlist_foreach(l, n, data) {
+ if (i == nth) {
+ return l;
}
- return NULL;
+ i++;
+ }
+
+ return NULL;
}
/* End of a file */