16cd6a6acSopenharmony_ci 26cd6a6acSopenharmony_ci/* Author : Stephen Smalley, <sds@tycho.nsa.gov> */ 36cd6a6acSopenharmony_ci 46cd6a6acSopenharmony_ci/* FLASK */ 56cd6a6acSopenharmony_ci 66cd6a6acSopenharmony_ci/* 76cd6a6acSopenharmony_ci * A double-ended queue is a singly linked list of 86cd6a6acSopenharmony_ci * elements of arbitrary type that may be accessed 96cd6a6acSopenharmony_ci * at either end. 106cd6a6acSopenharmony_ci */ 116cd6a6acSopenharmony_ci 126cd6a6acSopenharmony_ci#ifndef _QUEUE_H_ 136cd6a6acSopenharmony_ci#define _QUEUE_H_ 146cd6a6acSopenharmony_ci 156cd6a6acSopenharmony_citypedef void *queue_element_t; 166cd6a6acSopenharmony_ci 176cd6a6acSopenharmony_citypedef struct queue_node *queue_node_ptr_t; 186cd6a6acSopenharmony_ci 196cd6a6acSopenharmony_citypedef struct queue_node { 206cd6a6acSopenharmony_ci queue_element_t element; 216cd6a6acSopenharmony_ci queue_node_ptr_t next; 226cd6a6acSopenharmony_ci} queue_node_t; 236cd6a6acSopenharmony_ci 246cd6a6acSopenharmony_citypedef struct queue_info { 256cd6a6acSopenharmony_ci queue_node_ptr_t head; 266cd6a6acSopenharmony_ci queue_node_ptr_t tail; 276cd6a6acSopenharmony_ci} queue_info_t; 286cd6a6acSopenharmony_ci 296cd6a6acSopenharmony_citypedef queue_info_t *queue_t; 306cd6a6acSopenharmony_ci 316cd6a6acSopenharmony_ciqueue_t queue_create(void); 326cd6a6acSopenharmony_ciint queue_insert(queue_t, queue_element_t); 336cd6a6acSopenharmony_ciint queue_push(queue_t, queue_element_t); 346cd6a6acSopenharmony_ciqueue_element_t queue_remove(queue_t); 356cd6a6acSopenharmony_ciqueue_element_t queue_head(queue_t); 366cd6a6acSopenharmony_civoid queue_destroy(queue_t); 376cd6a6acSopenharmony_ci 386cd6a6acSopenharmony_ci/* 396cd6a6acSopenharmony_ci Applies the specified function f to each element in the 406cd6a6acSopenharmony_ci specified queue. 416cd6a6acSopenharmony_ci 426cd6a6acSopenharmony_ci In addition to passing the element to f, queue_map 436cd6a6acSopenharmony_ci passes the specified void* pointer to f on each invocation. 446cd6a6acSopenharmony_ci 456cd6a6acSopenharmony_ci If f returns a non-zero status, then queue_map will cease 466cd6a6acSopenharmony_ci iterating through the hash table and will propagate the error 476cd6a6acSopenharmony_ci return to its caller. 486cd6a6acSopenharmony_ci */ 496cd6a6acSopenharmony_ciint queue_map(queue_t, int (*f) (queue_element_t, void *), void *); 506cd6a6acSopenharmony_ci 516cd6a6acSopenharmony_ci/* 526cd6a6acSopenharmony_ci Same as queue_map, except that if f returns a non-zero status, 536cd6a6acSopenharmony_ci then the element will be removed from the queue and the g 546cd6a6acSopenharmony_ci function will be applied to the element. 556cd6a6acSopenharmony_ci */ 566cd6a6acSopenharmony_civoid queue_map_remove_on_error(queue_t, 576cd6a6acSopenharmony_ci int (*f) (queue_element_t, void *), 586cd6a6acSopenharmony_ci void (*g) (queue_element_t, void *), void *); 596cd6a6acSopenharmony_ci 606cd6a6acSopenharmony_ci#endif 616cd6a6acSopenharmony_ci 626cd6a6acSopenharmony_ci/* FLASK */ 63