diff options
Diffstat (limited to 'queue.h')
-rw-r--r-- | queue.h | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -0,0 +1,62 @@ + +/* Author : Stephen Smalley, <sds@epoch.ncsc.mil> */ + +/* FLASK */ + +/* + * A double-ended queue is a singly linked list of + * elements of arbitrary type that may be accessed + * at either end. + */ + +#ifndef _QUEUE_H_ +#define _QUEUE_H_ + +typedef void *queue_element_t; + +typedef struct queue_node *queue_node_ptr_t; + +typedef struct queue_node { + queue_element_t element; + queue_node_ptr_t next; +} queue_node_t; + +typedef struct queue_info { + queue_node_ptr_t head; + queue_node_ptr_t tail; +} queue_info_t; + +typedef queue_info_t *queue_t; + +queue_t queue_create(void); +int queue_insert(queue_t, queue_element_t); +int queue_push(queue_t, queue_element_t); +queue_element_t queue_remove(queue_t); +queue_element_t queue_head(queue_t); +void queue_destroy(queue_t); + +/* + Applies the specified function f to each element in the + specified queue. + + In addition to passing the element to f, queue_map + passes the specified void* pointer to f on each invocation. + + If f returns a non-zero status, then queue_map will cease + iterating through the hash table and will propagate the error + return to its caller. + */ +int queue_map(queue_t, int (*f) (queue_element_t, void *), void *); + +/* + Same as queue_map, except that if f returns a non-zero status, + then the element will be removed from the queue and the g + function will be applied to the element. + */ +void queue_map_remove_on_error(queue_t, + int (*f) (queue_element_t, void *), + void (*g) (queue_element_t, void *), void *); + +#endif + +/* FLASK */ |