60f2218a54b0f995054c20c2400468407d8b8d9e
[egate.git] / util / strqueue.c
1 /* Gateway utility
2  * Europagate, 1995
3  *
4  * $Log: strqueue.c,v $
5  * Revision 1.1  1995/03/28 11:42:41  adam
6  * First version of string-queue utility.
7  *
8  */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <assert.h>
13 #include <string.h>
14
15 #include <strqueue.h>
16
17 struct str_entry {
18     char *buf;
19     struct str_entry *prev;
20 };
21
22 struct str_queue *str_queue_mk (void)
23 {
24     struct str_queue *sq;
25
26     sq = malloc (sizeof(*sq));
27     if (!sq)
28         return NULL;
29     sq->first = NULL;
30     sq->last = NULL;
31     return sq;
32 }
33
34 void str_queue_rm (struct str_queue **sq)
35 {
36     free (*sq);
37     *sq = NULL;
38 }
39
40 char *str_queue_enq (struct str_queue *sq, const char *msg)
41 {
42     struct str_entry *n;
43
44     assert (sq);
45     assert (msg);
46     n = malloc (sizeof(*n));
47     if (!n)
48         return NULL;
49     n->buf = malloc (strlen(msg)+1);
50     if (!n->buf)
51     {
52         free (n);
53         return NULL;
54     }
55     strcpy (n->buf, msg);
56     n->prev = NULL;
57     if (!sq->first)
58         sq->last = n;
59     else
60         sq->first->prev = n;
61     sq->first = n;
62     return n->buf;
63 }
64
65 char *str_queue_get (struct str_queue *sq, int index)
66 {
67     struct str_entry *n;
68
69     assert (sq);
70     for (n = sq->last; n && index > 0; --index)
71         n = n->prev;
72     if (!n)
73         return NULL;
74     return n->buf;
75 }
76
77 int str_queue_deq (struct str_queue *sq, char *dst, int max)
78 {
79     struct str_entry *n;
80
81     assert (sq);
82     if (!(n = sq->last))
83         return 0;
84     sq->last = n->prev;
85     if (!sq->last)
86         sq->first = NULL;
87     if (dst && max > 1)
88     {
89         strncpy (dst, n->buf, max-1);
90         dst[max-1] = '\0';
91     }
92     free (n->buf);
93     free (n);
94     return 1;
95 }