]> andersk Git - moira.git/blame - lib/sq.c
POSIX, ANSI, sanity fixes
[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>
a43ce477 13#include <stdlib.h>
24582af9 14
1992b825 15struct save_queue *
16sq_create()
17{
18 register struct save_queue *sq;
19
20 sq = (struct save_queue *)malloc(sizeof (struct save_queue));
9d627547 21 if (!sq) return sq;
1992b825 22 sq->q_next = sq;
23 sq->q_prev = sq;
24 sq->q_lastget = 0;
25 return(sq);
26}
27
9d627547 28int
1992b825 29sq_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));
9d627547 36 if (!q) return 0;
1992b825 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;
9d627547 42 return 1;
1992b825 43}
44
9d627547 45int
1992b825 46sq_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 *));
9d627547 56 if (!argv_copy) return 0;
1992b825 57 for (i = 0; i < argc; i++) {
58 n = strlen(argv[i]) + 1;
59 argv_copy[i] = (char *)malloc(n);
9d627547 60 if (!argv_copy[i]) {
61 for(i--; i>=0; i--) free(argv_copy[i]);
62 free((char **)argv_copy);
63 return 0;
64 }
8fd777cf 65 memcpy(argv_copy[i], argv[i], n);
1992b825 66 }
67
9d627547 68 return sq_save_data(sq, (char *)argv_copy);
1992b825 69}
70
9d627547 71int
1992b825 72sq_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)
a43ce477 79 if (q->q_data == data) return 1;
1992b825 80
9d627547 81 return sq_save_data(sq, data);
1992b825 82}
83
9d627547 84int
1992b825 85sq_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)
a43ce477 92 if (!strcmp(q->q_data, data)) return 1;
1992b825 93
9d627547 94 return sq_save_data(sq, data);
1992b825 95}
96
9d627547 97int
1992b825 98sq_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
9d627547 113int
bfa8d940 114sq_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
128int 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
1992b825 137sq_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 1.81808 seconds and 5 git commands to generate.