diff options
Diffstat (limited to 'src')
| -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;  		} | 
