--- /dev/null
+/* 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;
+}