]> andersk Git - moira.git/blob - lib/sq.c
Initial revision
[moira.git] / lib / sq.c
1 /* $Header$
2  *
3  * Generic Queue Routines
4  */
5
6 #include "sms_app.h"
7
8 struct save_queue *
9 sq_create()
10 {
11     register struct save_queue *sq;
12
13     sq = (struct save_queue *)malloc(sizeof (struct save_queue));
14     sq->q_next = sq;
15     sq->q_prev = sq;
16     sq->q_lastget = 0;
17     return(sq);
18 }
19
20 sq_save_data(sq, data)
21     register struct save_queue *sq;
22     char *data;
23 {
24     register struct save_queue *q;
25
26     q = (struct save_queue *)malloc(sizeof (struct save_queue));
27     q->q_next = sq;
28     q->q_prev = sq->q_prev;
29     sq->q_prev->q_next = q;
30     sq->q_prev = q;
31     q->q_data = data;
32 }
33
34 sq_save_args(argc, argv, sq)
35     register struct save_queue *sq;
36     register int argc;
37     register char *argv[];
38 {
39     register char **argv_copy;
40     register int i;
41     register int n;
42
43     argv_copy = (char **)malloc(argc * sizeof (char *));
44     for (i = 0; i < argc; i++) {
45         n = strlen(argv[i]) + 1;
46         argv_copy[i] = (char *)malloc(n);
47         bcopy(argv[i], argv_copy[i], n);
48     }
49
50     sq_save_data(sq, argv_copy);
51 }
52
53 sq_save_unique_data(sq, data)
54     register struct save_queue *sq;
55     char *data;
56 {
57     register struct save_queue *q;
58
59     for (q = sq->q_next; q != sq; q = q->q_next)
60         if (q->q_data == data) return;
61
62     sq_save_data(sq, data);
63 }
64
65 sq_save_unique_string(sq, data)
66     register struct save_queue *sq;
67     char *data;
68 {
69     register struct save_queue *q;
70
71     for (q = sq->q_next; q != sq; q = q->q_next)
72         if (!strcmp(q->q_data, data)) return;
73
74     sq_save_data(sq, data);
75 }
76
77 sq_get_data(sq, data)
78     register struct save_queue *sq;
79     register char **data;
80 {
81     if (sq->q_lastget == (struct save_queue *)0) {
82         sq->q_lastget = sq->q_next;
83     } else {
84         sq->q_lastget = sq->q_lastget->q_next;
85     }
86
87     if (sq->q_lastget == sq) return(0);
88     *data = sq->q_lastget->q_data;
89     return(1);
90 }
91
92 sq_destroy(sq)
93     register struct save_queue *sq;
94 {
95     register struct save_queue *q;
96
97     for (q = sq->q_next; q != sq; q = sq->q_next) {
98         sq->q_next = q->q_next;
99         free(q);                        
100     }
101     free(sq);
102 }
103
This page took 0.055791 seconds and 5 git commands to generate.