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