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