1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/* Copyright (c) 2007-2009, UNINETT AS */
/* See LICENSE for licensing information. */
#if defined HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "list.h"
/* allocates and initialises list structure; returns NULL if malloc fails */
struct list *list_create() {
struct list *list = malloc(sizeof(struct list));
if (list)
memset(list, 0, sizeof(struct list));
return list;
}
/* frees all memory associated with the list */
void list_destroy(struct list *list) {
struct list_node *node, *next;
if (!list)
return;
for (node = list->first; node; node = next) {
free(node->data);
next = node->next;
free(node);
}
free(list);
}
/* appends entry to list; returns 1 if ok, 0 if malloc fails */
int list_push(struct list *list, void *data) {
struct list_node *node;
node = malloc(sizeof(struct list_node));
if (!node)
return 0;
node->next = NULL;
node->data = data;
if (list->first)
list->last->next = node;
else
list->first = node;
list->last = node;
list->count++;
return 1;
}
/* removes first entry from list and returns data */
void *list_shift(struct list *list) {
struct list_node *node;
void *data;
if (!list || !list->first)
return NULL;
node = list->first;
list->first = node->next;
if (!list->first)
list->last = NULL;
data = node->data;
free(node);
list->count--;
return data;
}
/* removes all entries with matching data pointer */
void list_removedata(struct list *list, void *data) {
struct list_node *node, *t;
if (!list || !list->first)
return;
node = list->first;
while (node->data == data) {
list->first = node->next;
free(node);
list->count--;
node = list->first;
if (!node) {
list->last = NULL;
return;
}
}
for (; node->next; node = node->next)
if (node->next->data == data) {
t = node->next;
node->next = t->next;
free(t);
list->count--;
if (!node->next) { /* we removed the last one */
list->last = node;
return;
}
}
}
/* returns first node */
struct list_node *list_first(struct list *list) {
return list ? list->first : NULL;
}
/* returns the next node after the argument */
struct list_node *list_next(struct list_node *node) {
return node->next;
}
/* returns number of nodes */
uint32_t list_count(struct list *list) {
return list->count;
}
/* Local Variables: */
/* c-file-style: "stroustrup" */
/* End: */
|