dockapps/wmradio/lists.c

148 lines
2.3 KiB
C

#include "lists.h"
#include <string.h>
List *list_new_item()
{
List *item;
item = (List *)malloc(sizeof(List));
if(item) memset(item, 0, sizeof(List));
return item;
}
List *list_last(List *list)
{
List *item;
item = list;
if(!item) return NULL;
while(item->next) item = item->next;
return item;
}
List *list_add(List *list, List *newitem)
{
List *lastitem;
if(!newitem) return list;
if(!list) return newitem;
lastitem = list_last(list);
lastitem -> next = newitem;
newitem -> prev = lastitem;
return list;
}
List *list_add_data(List *list, void *data)
{
List *newitem;
newitem = list_new_item();
if(!newitem) return list;
list = list_add(list,newitem);
newitem -> data = data;
return list;
}
List *list_node_with_data(List *list, void *data)
{
List *item;
item = list;
while(item) {
if(item->data == data) return item;
item = item->next;
}
return NULL;
}
int list_length(List *list)
{
int l = 0;
List *item;
if(!list) return 0;
item = list;
while(item) {
l++;
item = item->next;
}
return l;
}
List *list_nth_node(List *list, int index)
{
List *item;
int i;
item = list;
i = 0;
while(item) {
if( i == index ) return item;
i++;
item = item->next;
}
return NULL;
}
List *list_remove_node(List *list, List *node)
{
List *prev,*next;
if(!list) return list;
if(!node) return list;
prev = node ->prev;
next = node ->next;
node -> next = NULL;
node -> prev = NULL;
if(prev) prev->next = next;
if(next) next->prev = prev;
if(prev) return list;
return prev;
}
List *list_delete_node(List *list, List *node)
{
list = list_remove_node(list,node);
free(node);
return list;
}
void list_for_each(List *list, list_for_each_function func, void *data)
{
List *item = list;
if(!list) return;
if(!func) return;
while(item) {
if( func(item, data) ) return;
item = item -> next;
}
}
void list_free(List *list)
{
List *item, *prev;
item = list_last(list);
while(item) {
prev = item->prev;
free(item);
item = prev;
}
}
int list_has_node(List *list, List *node)
{
List *i;
for(i=list; i ; i = i->next) {
if( i == node ) return 1;
}
return 0;
}