summaryrefslogtreecommitdiffstats
path: root/list.c
diff options
context:
space:
mode:
authorMalfurious <m@lfurio.us>2024-05-03 22:30:34 -0400
committerMalfurious <m@lfurio.us>2024-05-08 05:57:59 -0400
commitb67c753ac8bed628b5596ff71909708500d432a2 (patch)
tree232b181a6d404023da5083cfaab4d63e03336217 /list.c
parentac95555111931d77b46ca6ad9fff51ae7db61be9 (diff)
downloadmisplays-b67c753ac8bed628b5596ff71909708500d432a2.tar.gz
misplays-b67c753ac8bed628b5596ff71909708500d432a2.zip
Add additional list operations
Add list functions which can efficiently cut down on some bolierplate. The rest of the code will eventually be cleaned to make use of them. Signed-off-by: Malfurious <m@lfurio.us>
Diffstat (limited to 'list.c')
-rw-r--r--list.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/list.c b/list.c
index 9cf1ad0..a05aab2 100644
--- a/list.c
+++ b/list.c
@@ -1,4 +1,3 @@
-#include <stddef.h>
#include "list.h"
struct _list {
@@ -11,6 +10,26 @@ void list_init(struct list *list) {
list->end = list;
}
+int list_empty(struct list *list) {
+ return list->head == list->end;
+}
+
+int list_singleton(struct list *list) {
+ return list->head == list->tail && list->head != list->end;
+}
+
+void *list_circular_prev(void *_node) {
+ struct _list *node = _node;
+ do { node = node->prev; } while (node == node->listhead);
+ return node;
+}
+
+void *list_circular_next(void *_node) {
+ struct _list *node = _node;
+ do { node = node->next; } while (node == node->listhead);
+ return node;
+}
+
void list_insert(void *_next, void *_node) {
struct _list *node = _node;
struct _list *next = _next;
@@ -19,6 +38,7 @@ void list_insert(void *_next, void *_node) {
prev->next = node;
node->next = next;
node->prev = prev;
+ node->listhead = next->listhead;
}
void list_remove(void *_node) {
@@ -27,6 +47,4 @@ void list_remove(void *_node) {
struct _list *prev = node->prev;
next->prev = prev;
prev->next = next;
- node->next = NULL;
- node->prev = NULL;
}