/* $Id: list.c 6168 2003-01-21 06:27:32Z alexk $
**
*/
#include "config.h"
#include "clibrary.h"
#include "inn/list.h"
void
list_new(struct list *list)
{
list->head = (struct node *)&list->tail;
list->tailpred = (struct node *)&list->head;
list->tail = NULL;
}
struct node *
list_addhead(struct list *list, struct node *node)
{
node->succ = list->head;
node->pred = (struct node *)&list->head;
list->head->pred = node;
list->head = node;
return node;
}
struct node *
list_addtail(struct list *list, struct node *node)
{
node->succ = (struct node *)&list->tail;
node->pred = list->tailpred;
list->tailpred->succ = node;
list->tailpred = node;
return node;
}
struct node *
list_remhead(struct list *list)
{
struct node *node;
node = list->head->succ;
if (node) {
node->pred = (struct node *)&list->head;
node = list->head;
list->head = node->succ;
}
return node;
}
struct node *
list_head(struct list *list)
{
if (list->head->succ)
return list->head;
return NULL;
}
struct node *
list_tail(struct list *list)
{
if (list->tailpred->pred)
return list->tailpred;
return NULL;
}
struct node *
list_succ(struct node *node)
{
if (node->succ->succ)
return node->succ;
return NULL;
}
struct node *
list_pred(struct node *node)
{
if (node->pred->pred)
return node->pred;
return NULL;
}
struct node *
list_remove(struct node *node)
{
node->pred->succ = node->succ;
node->succ->pred = node->pred;
return node;
}
struct node *
list_remtail(struct list *list)
{
struct node *node;
node = list_tail(list);
if (node)
list_remove(node);
return node;
}
bool
list_isempty(struct list *list)
{
return list->tailpred == (struct node *)list;
}
struct node *
list_insert(struct list *list, struct node *node, struct node *pred)
{
if (pred) {
if (pred->succ) {
node->succ = pred->succ;
node->pred = pred;
pred->succ->pred = node;
pred->succ = node;
} else {
list_addtail(list, node);
}
} else {
list_addhead(list, node);
}
return node;
}
syntax highlighted by Code2HTML, v. 0.9.1