]> andersk Git - moira.git/blob - lib/sq.c
406f0b593a08b1efbf62b00d43d1d58a222ffba6
[moira.git] / lib / sq.c
1 /* $Header$
2  *
3  * Generic Queue Routines
4  *
5  *  (c) Copyright 1988 by the Massachusetts Institute of Technology.
6  *  For copying and distribution information, please see the file
7  *  <mit-copyright.h>.
8  */
9
10 #include <mit-copyright.h>
11 #include <moira.h>
12 #include <string.h>
13 #include <stdlib.h>
14
15 struct save_queue *sq_create(void)
16 {
17   register struct save_queue *sq;
18
19   sq = malloc(sizeof(struct save_queue));
20   if (!sq)
21     return sq;
22   sq->q_next = sq;
23   sq->q_prev = sq;
24   sq->q_lastget = 0;
25   return sq;
26 }
27
28 int sq_save_data(register struct save_queue *sq, char *data)
29 {
30   register struct save_queue *q;
31
32   q = malloc(sizeof(struct save_queue));
33   if (!q)
34     return 0;
35   q->q_next = sq;
36   q->q_prev = sq->q_prev;
37   sq->q_prev->q_next = q;
38   sq->q_prev = q;
39   q->q_data = data;
40   return 1;
41 }
42
43 int sq_save_args(register int argc, register char *argv[],
44                  register struct save_queue *sq)
45 {
46   register char **argv_copy;
47   register int i;
48   register int n;
49
50   argv_copy = malloc(argc * sizeof(char *));
51   if (!argv_copy)
52     return 0;
53   for (i = 0; i < argc; i++)
54     {
55       n = strlen(argv[i]) + 1;
56       argv_copy[i] = malloc(n);
57       if (!argv_copy[i])
58         {
59           for (i--; i >= 0; i--)
60             free(argv_copy[i]);
61           free(argv_copy);
62           return 0;
63         }
64       memcpy(argv_copy[i], argv[i], n);
65     }
66
67   return sq_save_data(sq, (char *)argv_copy);
68 }
69
70 int sq_save_unique_data(register struct save_queue *sq, char *data)
71 {
72   register struct save_queue *q;
73
74   for (q = sq->q_next; q != sq; q = q->q_next)
75     {
76       if (q->q_data == data)
77         return 1;
78     }
79
80   return sq_save_data(sq, data);
81 }
82
83 int sq_save_unique_string(register struct save_queue *sq, char *data)
84 {
85   register struct save_queue *q;
86
87   for (q = sq->q_next; q != sq; q = q->q_next)
88     {
89       if (!strcmp(q->q_data, data))
90         return 1;
91     }
92
93   return sq_save_data(sq, data);
94 }
95
96 int sq_get_data(register struct save_queue *sq, register char **data)
97 {
98   if (sq->q_lastget == (struct save_queue *)0)
99     sq->q_lastget = sq->q_next;
100   else
101     sq->q_lastget = sq->q_lastget->q_next;
102
103   if (sq->q_lastget == sq)
104     return 0;
105   *data = sq->q_lastget->q_data;
106   return 1;
107 }
108
109 int sq_remove_data(register struct save_queue *sq, register char **data)
110 {
111   if (sq->q_next != sq)
112     {
113       *data = sq->q_next->q_data;
114       sq->q_next = sq->q_next->q_next;
115       free(sq->q_next->q_prev);
116       sq->q_next->q_prev = sq;
117       return 1;
118     }
119   return 0;
120 }
121
122 int sq_empty(register struct save_queue *sq)
123 {
124   if (sq->q_next == sq)
125     return 1;
126   else
127     return 0;
128 }
129
130 sq_destroy(register struct save_queue *sq)
131 {
132   register struct save_queue *q;
133
134   for (q = sq->q_next; q != sq; q = sq->q_next)
135     {
136       sq->q_next = q->q_next;
137       free(q);
138     }
139   free(sq);
140 }
141
This page took 0.033613 seconds and 3 git commands to generate.