]> andersk Git - moira.git/blame_incremental - lib/sq.c
Diane Delgado's changes for a fixed table-locking order
[moira.git] / lib / sq.c
... / ...
CommitLineData
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
14extern char *malloc();
15
16struct save_queue *
17sq_create()
18{
19 register struct save_queue *sq;
20
21 sq = (struct save_queue *)malloc(sizeof (struct save_queue));
22 if (!sq) return sq;
23 sq->q_next = sq;
24 sq->q_prev = sq;
25 sq->q_lastget = 0;
26 return(sq);
27}
28
29int
30sq_save_data(sq, data)
31 register struct save_queue *sq;
32 char *data;
33{
34 register struct save_queue *q;
35
36 q = (struct save_queue *)malloc(sizeof (struct save_queue));
37 if (!q) return 0;
38 q->q_next = sq;
39 q->q_prev = sq->q_prev;
40 sq->q_prev->q_next = q;
41 sq->q_prev = q;
42 q->q_data = data;
43 return 1;
44}
45
46int
47sq_save_args(argc, argv, sq)
48 register struct save_queue *sq;
49 register int argc;
50 register char *argv[];
51{
52 register char **argv_copy;
53 register int i;
54 register int n;
55
56 argv_copy = (char **)malloc(argc * sizeof (char *));
57 if (!argv_copy) return 0;
58 for (i = 0; i < argc; i++) {
59 n = strlen(argv[i]) + 1;
60 argv_copy[i] = (char *)malloc(n);
61 if (!argv_copy[i]) {
62 for(i--; i>=0; i--) free(argv_copy[i]);
63 free((char **)argv_copy);
64 return 0;
65 }
66 memcpy(argv_copy[i], argv[i], n);
67 }
68
69 return sq_save_data(sq, (char *)argv_copy);
70}
71
72int
73sq_save_unique_data(sq, data)
74 register struct save_queue *sq;
75 char *data;
76{
77 register struct save_queue *q;
78
79 for (q = sq->q_next; q != sq; q = q->q_next)
80 if (q->q_data == data) return;
81
82 return sq_save_data(sq, data);
83}
84
85int
86sq_save_unique_string(sq, data)
87 register struct save_queue *sq;
88 char *data;
89{
90 register struct save_queue *q;
91
92 for (q = sq->q_next; q != sq; q = q->q_next)
93 if (!strcmp(q->q_data, data)) return;
94
95 return sq_save_data(sq, data);
96}
97
98int
99sq_get_data(sq, data)
100 register struct save_queue *sq;
101 register char **data;
102{
103 if (sq->q_lastget == (struct save_queue *)0) {
104 sq->q_lastget = sq->q_next;
105 } else {
106 sq->q_lastget = sq->q_lastget->q_next;
107 }
108
109 if (sq->q_lastget == sq) return(0);
110 *data = sq->q_lastget->q_data;
111 return(1);
112}
113
114int
115sq_remove_data(sq, data)
116 register struct save_queue *sq;
117 register char **data;
118{
119 if (sq->q_next != sq) {
120 *data = sq->q_next->q_data;
121 sq->q_next = sq->q_next->q_next;
122 free(sq->q_next->q_prev);
123 sq->q_next->q_prev = sq;
124 return(1);
125 }
126 return(0);
127}
128
129int sq_empty(sq)
130 register struct save_queue *sq;
131{
132 if (sq->q_next == sq)
133 return(1);
134 else
135 return(0);
136}
137
138sq_destroy(sq)
139 register struct save_queue *sq;
140{
141 register struct save_queue *q;
142
143 for (q = sq->q_next; q != sq; q = sq->q_next) {
144 sq->q_next = q->q_next;
145 free(q);
146 }
147 free(sq);
148}
149
This page took 0.061709 seconds and 5 git commands to generate.