WIP: Fix the Proxy-State issue.
[libradsec.git] / list.c
diff --git a/list.c b/list.c
index 26f0fd2..d9612b8 100644 (file)
--- a/list.c
+++ b/list.c
@@ -1,35 +1,50 @@
-/* Copyright (c) 2006-2009, Stig Venaas, UNINETT AS.
- * Copyright (c) 2010, UNINETT AS, NORDUnet A/S.
- * Copyright (c) 2010-2012, NORDUnet A/S. */
+/* Copyright (c) 2007-2009, UNINETT AS */
 /* See LICENSE for licensing information. */
 
 #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) {
+/* 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;