1*2d543d20SAndroid Build Coastguard Worker 2*2d543d20SAndroid Build Coastguard Worker /* Author : Stephen Smalley, <[email protected]> */ 3*2d543d20SAndroid Build Coastguard Worker 4*2d543d20SAndroid Build Coastguard Worker /* FLASK */ 5*2d543d20SAndroid Build Coastguard Worker 6*2d543d20SAndroid Build Coastguard Worker /* 7*2d543d20SAndroid Build Coastguard Worker * A double-ended queue is a singly linked list of 8*2d543d20SAndroid Build Coastguard Worker * elements of arbitrary type that may be accessed 9*2d543d20SAndroid Build Coastguard Worker * at either end. 10*2d543d20SAndroid Build Coastguard Worker */ 11*2d543d20SAndroid Build Coastguard Worker 12*2d543d20SAndroid Build Coastguard Worker #ifndef _QUEUE_H_ 13*2d543d20SAndroid Build Coastguard Worker #define _QUEUE_H_ 14*2d543d20SAndroid Build Coastguard Worker 15*2d543d20SAndroid Build Coastguard Worker typedef void *queue_element_t; 16*2d543d20SAndroid Build Coastguard Worker 17*2d543d20SAndroid Build Coastguard Worker typedef struct queue_node *queue_node_ptr_t; 18*2d543d20SAndroid Build Coastguard Worker 19*2d543d20SAndroid Build Coastguard Worker typedef struct queue_node { 20*2d543d20SAndroid Build Coastguard Worker queue_element_t element; 21*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t next; 22*2d543d20SAndroid Build Coastguard Worker } queue_node_t; 23*2d543d20SAndroid Build Coastguard Worker 24*2d543d20SAndroid Build Coastguard Worker typedef struct queue_info { 25*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t head; 26*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t tail; 27*2d543d20SAndroid Build Coastguard Worker } queue_info_t; 28*2d543d20SAndroid Build Coastguard Worker 29*2d543d20SAndroid Build Coastguard Worker typedef queue_info_t *queue_t; 30*2d543d20SAndroid Build Coastguard Worker 31*2d543d20SAndroid Build Coastguard Worker queue_t queue_create(void); 32*2d543d20SAndroid Build Coastguard Worker int queue_insert(queue_t, queue_element_t); 33*2d543d20SAndroid Build Coastguard Worker int queue_push(queue_t, queue_element_t); 34*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_remove(queue_t); 35*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_head(queue_t); 36*2d543d20SAndroid Build Coastguard Worker void queue_destroy(queue_t); 37*2d543d20SAndroid Build Coastguard Worker 38*2d543d20SAndroid Build Coastguard Worker /* 39*2d543d20SAndroid Build Coastguard Worker Applies the specified function f to each element in the 40*2d543d20SAndroid Build Coastguard Worker specified queue. 41*2d543d20SAndroid Build Coastguard Worker 42*2d543d20SAndroid Build Coastguard Worker In addition to passing the element to f, queue_map 43*2d543d20SAndroid Build Coastguard Worker passes the specified void* pointer to f on each invocation. 44*2d543d20SAndroid Build Coastguard Worker 45*2d543d20SAndroid Build Coastguard Worker If f returns a non-zero status, then queue_map will cease 46*2d543d20SAndroid Build Coastguard Worker iterating through the hash table and will propagate the error 47*2d543d20SAndroid Build Coastguard Worker return to its caller. 48*2d543d20SAndroid Build Coastguard Worker */ 49*2d543d20SAndroid Build Coastguard Worker int queue_map(queue_t, int (*f) (queue_element_t, void *), void *); 50*2d543d20SAndroid Build Coastguard Worker 51*2d543d20SAndroid Build Coastguard Worker /* 52*2d543d20SAndroid Build Coastguard Worker Same as queue_map, except that if f returns a non-zero status, 53*2d543d20SAndroid Build Coastguard Worker then the element will be removed from the queue and the g 54*2d543d20SAndroid Build Coastguard Worker function will be applied to the element. 55*2d543d20SAndroid Build Coastguard Worker */ 56*2d543d20SAndroid Build Coastguard Worker void queue_map_remove_on_error(queue_t, 57*2d543d20SAndroid Build Coastguard Worker int (*f) (queue_element_t, void *), 58*2d543d20SAndroid Build Coastguard Worker void (*g) (queue_element_t, void *), void *); 59*2d543d20SAndroid Build Coastguard Worker 60*2d543d20SAndroid Build Coastguard Worker #endif 61*2d543d20SAndroid Build Coastguard Worker 62*2d543d20SAndroid Build Coastguard Worker /* FLASK */ 63