diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2019-05-07 17:41:51 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2019-05-07 17:41:51 -0700 |
commit | e46a14e914fe8eaa7087154cf32cb9c86c0aa023 (patch) | |
tree | 0a0f4c54946eed4fb694642f650f1e104a7865c6 | |
parent | 53959d40924628f1ebae3e7d524318eb212de4bf (diff) |
libstage: use dll.h for linked lists, rm list.h
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/list.h | 252 | ||||
-rw-r--r-- | src/stage.c | 27 |
3 files changed, 16 insertions, 266 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index a57bc54..de38d5f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,2 +1,3 @@ noinst_LIBRARIES = libstage.a -libstage_a_SOURCES = list.h stage.c stage.h +libstage_a_SOURCES = ../include/dll_h/dll.h stage.c stage.h +libstage_a_CPPFLAGS = -I@top_srcdir@/include diff --git a/src/list.h b/src/list.h deleted file mode 100644 index 48bca36..0000000 --- a/src/list.h +++ /dev/null @@ -1,252 +0,0 @@ -#ifndef __LIST_H -#define __LIST_H - -/* linux kernel linked list interface */ - -/* - * Simple doubly linked list implementation. - * - * Some of the internal functions ("__xxx") are useful when - * manipulating whole lists rather than single entries, as - * sometimes we already know the next/prev entries and we can - * generate better code by using them directly rather than - * using the generic single-entry routines. - */ - -typedef struct list_head { - struct list_head *next, *prev; -} list_head_t; - -#define LIST_HEAD_INIT(name) { &(name), &(name) } - -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) - -#define INIT_LIST_HEAD(ptr) do { \ - (ptr)->next = (ptr); (ptr)->prev = (ptr); \ -} while (0) - -/* - * Insert a new entry between two known consecutive entries. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_add(struct list_head *new, - struct list_head *prev, - struct list_head *next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next = new; -} - -/** - * list_add - add a new entry - * @new: new entry to be added - * @head: list head to add it after - * - * Insert a new entry after the specified head. - * This is good for implementing stacks. - */ -static inline void list_add(struct list_head *new, struct list_head *head) -{ - __list_add(new, head, head->next); -} - -/** - * list_add_tail - add a new entry - * @new: new entry to be added - * @head: list head to add it before - * - * Insert a new entry before the specified head. - * This is useful for implementing queues. - */ -static inline void list_add_tail(struct list_head *new, struct list_head *head) -{ - __list_add(new, head->prev, head); -} - -/* - * Delete a list entry by making the prev/next entries - * point to each other. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_del(struct list_head *prev, struct list_head *next) -{ - next->prev = prev; - prev->next = next; -} - -/** - * list_del - deletes entry from list. - * @entry: the element to delete from the list. - * Note: list_empty on entry does not return true after this, the entry is in an undefined state. - */ -static inline void list_del(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - entry->next = (void *) 0; - entry->prev = (void *) 0; -} - -/** - * list_del_init - deletes entry from list and reinitialize it. - * @entry: the element to delete from the list. - */ -static inline void list_del_init(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - INIT_LIST_HEAD(entry); -} - -/** - * list_move - delete from one list and add as another's head - * @list: the entry to move - * @head: the head that will precede our entry - */ -static inline void list_move(struct list_head *list, struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add(list, head); -} - -/** - * list_move_tail - delete from one list and add as another's tail - * @list: the entry to move - * @head: the head that will follow our entry - */ -static inline void list_move_tail(struct list_head *list, - struct list_head *head) -{ - __list_del(list->prev, list->next); - list_add_tail(list, head); -} - -/** - * list_empty - tests whether a list is empty - * @head: the list to test. - */ -static inline int list_empty(struct list_head *head) -{ - return head->next == head; -} - -static inline void __list_splice(struct list_head *list, - struct list_head *head) -{ - struct list_head *first = list->next; - struct list_head *last = list->prev; - struct list_head *at = head->next; - - first->prev = head; - head->next = first; - - last->next = at; - at->prev = last; -} - -/** - * list_splice - join two lists - * @list: the new list to add. - * @head: the place to add it in the first list. - */ -static inline void list_splice(struct list_head *list, struct list_head *head) -{ - if (!list_empty(list)) - __list_splice(list, head); -} - -/** - * list_splice_init - join two lists and reinitialise the emptied list. - * @list: the new list to add. - * @head: the place to add it in the first list. - * - * The list at @list is reinitialised - */ -static inline void list_splice_init(struct list_head *list, - struct list_head *head) -{ - if (!list_empty(list)) { - __list_splice(list, head); - INIT_LIST_HEAD(list); - } -} - -/** - * list_entry - get the struct for this entry - * @ptr: the &struct list_head pointer. - * @type: the type of the struct this is embedded in. - * @member: the name of the list_struct within the struct. - */ -#define list_entry(ptr, type, member) \ - ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) - -/** - * list_for_each - iterate over a list - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each(pos, head) \ - for (pos = (head)->next; pos != (head); \ - pos = pos->next) -/** - * list_for_each_prev - iterate over a list backwards - * @pos: the &struct list_head to use as a loop counter. - * @head: the head for your list. - */ -#define list_for_each_prev(pos, head) \ - for (pos = (head)->prev; pos != (head); \ - pos = pos->prev) - -/** - * list_for_each_safe - iterate over a list safe against removal of list entry - * @pos: the &struct list_head to use as a loop counter. - * @n: another &struct list_head to use as temporary storage - * @head: the head for your list. - */ -#define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) - -/** - * list_for_each_entry - iterate over list of given type - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member)) - -/** - * list_for_each_entry_prev - iterate over list of given type backwards - * @pos: the type * to use as a loop counter. - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_prev(pos, head, member) \ - for (pos = list_entry((head)->prev, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_entry(pos->member.prev, typeof(*pos), member)) - - -/** - * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @pos: the type * to use as a loop counter. - * @n: another type * to use as temporary storage - * @head: the head for your list. - * @member: the name of the list_struct within the struct. - */ -#define list_for_each_entry_safe(pos, n, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - n = list_entry(pos->member.next, typeof(*pos), member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, typeof(*n), member)) - - -#endif diff --git a/src/stage.c b/src/stage.c index 6ded8a5..b35abda 100644 --- a/src/stage.c +++ b/src/stage.c @@ -17,12 +17,13 @@ #include <stdlib.h> #include <string.h> -#include "list.h" +#include <dll_h/dll.h> + #include "stage.h" struct stage_node_t { - list_head_t nodes; + dll_t nodes; char name[STAGE_NODE_NAME_MAX]; float alpha; /* alpha for the texture when composited */ unsigned active:1; /* node is active */ @@ -35,8 +36,8 @@ struct stage_node_t { struct stage_t { - list_head_t layers[STAGE_LAYERS_MAX]; - float alpha; /* alpha to apply to all nodes */ + dll_t layers[STAGE_LAYERS_MAX]; + float alpha; /* alpha to apply to all nodes */ }; @@ -84,7 +85,7 @@ stage_node_t * stage_node_new(stage_t *stage, int layer, const char *name, void if (!node) return NULL; - list_add_tail(&node->nodes, &stage->layers[layer]); + (void) dll_pre(&node->nodes, &stage->layers[layer]); return node; } @@ -117,7 +118,7 @@ void stage_node_replace(const stage_t *stage, stage_node_t *node, const char *na stage_node_t * stage_node_free(stage_t *stage, stage_node_t *node) { if (node) { - list_del(&node->nodes); + (void) dll_del(&node->nodes); node_free(stage, node); } @@ -151,8 +152,8 @@ void stage_node_set_locked(const stage_t *stage, stage_node_t *node, int locked) void stage_node_set_layer(stage_t *stage, stage_node_t *node, int layer) { /* TODO: assert layer sanity */ - list_del(&node->nodes); - list_add_tail(&node->nodes, &stage->layers[layer]); + (void) dll_del(&node->nodes); + (void) dll_pre(&node->nodes, &stage->layers[layer]); } @@ -167,7 +168,7 @@ stage_t * stage_new(void) return NULL; for (i = 0; i < STAGE_LAYERS_MAX; i++) - INIT_LIST_HEAD(&stage->layers[i]); + (void) dll_init(&stage->layers[i]); return stage; } @@ -179,7 +180,7 @@ static void _stage_clear(stage_t *stage, int force) int i; for (i = 0; i < STAGE_LAYERS_MAX; i++) { - list_for_each_entry_safe(node, _node, &stage->layers[i], nodes) { + DLL_FOR_EACH_ENTRY_SAFE(&stage->layers[i], node, _node, stage_node_t, nodes) { if (force || !node->locked) stage_node_free(stage, node); } @@ -245,11 +246,11 @@ void stage_get_alpha(stage_t *stage, float *res_alpha) } -static void render_nodes(const stage_t *stage, const list_head_t *head) +static void render_nodes(const stage_t *stage, const dll_t *nodes) { stage_node_t *node; - list_for_each_entry(node, head, nodes) { + DLL_FOR_EACH_ENTRY(nodes, node, stage_node_t, nodes) { if (!node->active) continue; @@ -280,7 +281,7 @@ stage_node_t * stage_node_lookup_name(const stage_t *stage, const char *name) int i; for (i = 0; i < STAGE_LAYERS_MAX; i++) { - list_for_each_entry(node, &stage->layers[i], nodes) { + DLL_FOR_EACH_ENTRY(&stage->layers[i], node, stage_node_t, nodes) { if (!strncmp(node->name, name, sizeof(node->name))) return node; } |