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