First version of string-queue utility.
[egate.git] / util / strqueue.c
diff --git a/util/strqueue.c b/util/strqueue.c
new file mode 100644 (file)
index 0000000..60f2218
--- /dev/null
@@ -0,0 +1,95 @@
+/* Gateway utility
+ * Europagate, 1995
+ *
+ * $Log: strqueue.c,v $
+ * Revision 1.1  1995/03/28 11:42:41  adam
+ * First version of string-queue utility.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+#include <strqueue.h>
+
+struct str_entry {
+    char *buf;
+    struct str_entry *prev;
+};
+
+struct str_queue *str_queue_mk (void)
+{
+    struct str_queue *sq;
+
+    sq = malloc (sizeof(*sq));
+    if (!sq)
+        return NULL;
+    sq->first = NULL;
+    sq->last = NULL;
+    return sq;
+}
+
+void str_queue_rm (struct str_queue **sq)
+{
+    free (*sq);
+    *sq = NULL;
+}
+
+char *str_queue_enq (struct str_queue *sq, const char *msg)
+{
+    struct str_entry *n;
+
+    assert (sq);
+    assert (msg);
+    n = malloc (sizeof(*n));
+    if (!n)
+        return NULL;
+    n->buf = malloc (strlen(msg)+1);
+    if (!n->buf)
+    {
+        free (n);
+        return NULL;
+    }
+    strcpy (n->buf, msg);
+    n->prev = NULL;
+    if (!sq->first)
+        sq->last = n;
+    else
+        sq->first->prev = n;
+    sq->first = n;
+    return n->buf;
+}
+
+char *str_queue_get (struct str_queue *sq, int index)
+{
+    struct str_entry *n;
+
+    assert (sq);
+    for (n = sq->last; n && index > 0; --index)
+        n = n->prev;
+    if (!n)
+        return NULL;
+    return n->buf;
+}
+
+int str_queue_deq (struct str_queue *sq, char *dst, int max)
+{
+    struct str_entry *n;
+
+    assert (sq);
+    if (!(n = sq->last))
+        return 0;
+    sq->last = n->prev;
+    if (!sq->last)
+        sq->first = NULL;
+    if (dst && max > 1)
+    {
+        strncpy (dst, n->buf, max-1);
+        dst[max-1] = '\0';
+    }
+    free (n->buf);
+    free (n);
+    return 1;
+}