summaryrefslogtreecommitdiff
path: root/kernel/old/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/old/list.c')
-rw-r--r--kernel/old/list.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/kernel/old/list.c b/kernel/old/list.c
new file mode 100644
index 0000000..5492615
--- /dev/null
+++ b/kernel/old/list.c
@@ -0,0 +1,63 @@
+/**
+** @file list.c
+**
+** @author Warren R. Carithers
+**
+** @brief Support for a basic linked list data type.
+**
+** This module provides a very basic linked list data structure.
+** A list can contain anything that has a pointer field in the first
+** four bytes; these routines assume those bytes contain a pointer to
+** the following entry in the list, whatever that may be.
+*/
+
+#define KERNEL_SRC
+
+#include <common.h>
+
+#include <list.h>
+
+/*
+** FUNCTIONS
+*/
+
+/**
+** Name: list_add
+**
+** Add the supplied data to the beginning of the specified list.
+**
+** @param[in,out] list The address of a list_t variable
+** @param[in] data The data to prepend to the list
+*/
+void list_add(list_t *list, void *data)
+{
+ // sanity checks
+ assert1(list != NULL);
+ assert1(data != NULL);
+
+ list_t *tmp = (list_t *)data;
+ tmp->next = list->next;
+ list->next = tmp;
+}
+
+/**
+** Name: list_remove
+**
+** Remove the first entry from a linked list.
+**
+** @param[in,out] list The address of a list_t variable
+**
+** @return a pointer to the removed data, or NULL if the list was empty
+*/
+void *list_remove(list_t *list)
+{
+ assert1(list != NULL);
+
+ list_t *data = list->next;
+ if (data != NULL) {
+ list->next = data->next;
+ data->next = NULL;
+ }
+
+ return (void *)data;
+}