]> andersk Git - moira.git/blob - lib/sq.c
Diane Delgado's changes for a fixed table-locking order
[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
14 extern char *malloc();
15
16 struct save_queue *
17 sq_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
29 int
30 sq_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
46 int
47 sq_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
72 int
73 sq_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
85 int
86 sq_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
98 int
99 sq_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
114 int
115 sq_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
129 int 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
138 sq_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.043563 seconds and 5 git commands to generate.