summaryrefslogtreecommitdiff
path: root/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'list.c')
-rw-r--r--list.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/list.c b/list.c
index 0a193ef..d9612b8 100644
--- a/list.c
+++ b/list.c
@@ -5,29 +5,46 @@
#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) {
+/* 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) {
- free(node->data);
+ 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));
+ if (list)
+ memset(list, 0, sizeof(struct list));
+ return 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) {
+ list_free_helper_(list, 1);
+}
+
+/* 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 */
int list_push(struct list *list, void *data) {
struct list_node *node;