18c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 28c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* Author : Stephen Smalley, <sds@epoch.ncsc.mil> */ 38c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 48c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* FLASK */ 58c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 68c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* 78c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * A double-ended queue is a singly linked list of 88c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * elements of arbitrary type that may be accessed 98c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android * at either end. 108c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android */ 118c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 128c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#ifndef _QUEUE_H_ 138c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#define _QUEUE_H_ 148c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 158c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidtypedef void *queue_element_t; 168c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 178c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidtypedef struct queue_node *queue_node_ptr_t; 188c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 198c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidtypedef struct queue_node { 208c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android queue_element_t element; 218c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android queue_node_ptr_t next; 228c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} queue_node_t; 238c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 248c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidtypedef struct queue_info { 258c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android queue_node_ptr_t head; 268c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android queue_node_ptr_t tail; 278c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android} queue_info_t; 288c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 298c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidtypedef queue_info_t *queue_t; 308c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 318c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidqueue_t queue_create(void); 328c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint queue_insert(queue_t, queue_element_t); 338c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint queue_push(queue_t, queue_element_t); 348c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidqueue_element_t queue_remove(queue_t); 358c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidqueue_element_t queue_head(queue_t); 368c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid queue_destroy(queue_t); 378c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 388c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* 398c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android Applies the specified function f to each element in the 408c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android specified queue. 418c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 428c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android In addition to passing the element to f, queue_map 438c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android passes the specified void* pointer to f on each invocation. 448c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 458c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android If f returns a non-zero status, then queue_map will cease 468c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android iterating through the hash table and will propagate the error 478c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android return to its caller. 488c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android */ 498c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidint queue_map(queue_t, int (*f) (queue_element_t, void *), void *); 508c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 518c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* 528c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android Same as queue_map, except that if f returns a non-zero status, 538c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android then the element will be removed from the queue and the g 548c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android function will be applied to the element. 558c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android */ 568c48de15b1afeb1cd01a753195a29b1a7811dbfSE Androidvoid queue_map_remove_on_error(queue_t, 578c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android int (*f) (queue_element_t, void *), 588c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android void (*g) (queue_element_t, void *), void *); 598c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 608c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android#endif 618c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android 628c48de15b1afeb1cd01a753195a29b1a7811dbfSE Android/* FLASK */ 63