#include <string.h>
#include "list.h"
+/* Private helper functions. */
+static void list_free_helper_(struct list *list, int free_data_flag) {
+ struct list_node *node, *next;
+
+ if (!list)
+ return;
+
+ for (node = list->first; node; node = next) {
+ if (free_data_flag)
+ free(node->data);
+ next = node->next;
+ free(node);
+ }
+ free(list);
+}
+
+/* Public functions. */
+
/* allocates and initialises list structure; returns NULL if malloc fails */
struct list *list_create() {
struct list *list = malloc(sizeof(struct list));
return list;
}
-/* frees all memory associated with the list */
+/* frees all memory associated with the list
+ note that the data pointed at from each node is also freed
+ use list_free() to free only the memory used by the list itself */
void list_destroy(struct list *list) {
- struct list_node *node, *next;
+ list_free_helper_(list, 1);
+}
- if (!list)
- return;
-
- for (node = list->first; node; node = next) {
- free(node->data);
- next = node->next;
- free(node);
- }
- free(list);
+/* frees the meory used by the list itself
+ note that the data pointed at from each node is not freed
+ use list_destroy() to free all the data associated with the list */
+void list_free(struct list *list) {
+ list_free_helper_(list, 0);
}
/* appends entry to list; returns 1 if ok, 0 if malloc fails */
node = malloc(sizeof(struct list_node));
if (!node)
return 0;
-
+
node->next = NULL;
node->data = 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)
/* 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;
uint32_t list_count(struct list *list) {
return list->count;
}
+
+/* Local Variables: */
+/* c-file-style: "stroustrup" */
+/* End: */