summaryrefslogtreecommitdiffstats
path: root/libapol/src/queue.h
diff options
context:
space:
mode:
Diffstat (limited to 'libapol/src/queue.h')
-rw-r--r--libapol/src/queue.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/libapol/src/queue.h b/libapol/src/queue.h
new file mode 100644
index 0000000..56eb97b
--- /dev/null
+++ b/libapol/src/queue.h
@@ -0,0 +1,86 @@
+/**
+ * @file
+ *
+ * This file is a copy of queue.h from NSA's CVS repository. It has
+ * been modified to follow the setools naming conventions.
+ *
+ * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
+ *
+ * A double-ended queue is a singly linked list of
+ * elements of arbitrary type that may be accessed
+ * at either end.
+ */
+
+#ifndef APOL_QUEUE_H
+#define APOL_QUEUE_H
+
+typedef struct apol_queue_node
+{
+ void *element;
+ struct apol_queue_node *next;
+} apol_queue_node_t;
+
+typedef struct apol_queue
+{
+ apol_queue_node_t *head;
+ apol_queue_node_t *tail;
+} apol_queue_t;
+
+/**
+ * Allocate and return a new queue. The caller is responsible for
+ * calling apol_queue_destroy() upon the return value.
+ *
+ * @return A newly allocated queue, or NULL upon error.
+ */
+apol_queue_t *apol_queue_create(void);
+
+/**
+ * Adds an element to the end of a queue.
+ *
+ * @param q Queue to modify.
+ * @param element Element to append to the end.
+ *
+ * @return 0 on success, < 0 on error.
+ */
+int apol_queue_insert(apol_queue_t * q, void *element);
+
+/**
+ * Adds an element to the beginning of a queue.
+ *
+ * @param q Queue to modify.
+ * @param element Element to prepend to the beginning.
+ *
+ * @return 0 on success, < 0 on error.
+ */
+int apol_queue_push(apol_queue_t * q, void *element);
+
+/**
+ * Remove the first element from a queue and return the data; the
+ * queue is advanced afterwards. If the queue was empty then return
+ * NULL.
+ *
+ * @return First element of a queue, or NULL if nothing is there.
+ */
+void *apol_queue_remove(apol_queue_t * q);
+
+/**
+ * Return the data within the first element, but do not remove it from
+ * the queue. If the queue was empty then return NULL.
+ *
+ * @return First element of a queue, or NULL if nothing is there.
+ */
+void *apol_queue_head(apol_queue_t * q);
+
+/**
+ * Destroy the referenced queue, but <i>do not</i> attempt to free the
+ * data stored within. (The caller is responsible for doing that.)
+ * Afterwards set the referenced variable to NULL. If the variable is
+ * NULL then do nothing.
+ *
+ * @param Reference to a queue to destroy.
+ */
+void apol_queue_destroy(apol_queue_t ** q);
+
+#endif
+
+/* FLASK */