1*2d543d20SAndroid Build Coastguard Worker
2*2d543d20SAndroid Build Coastguard Worker /* Author : Stephen Smalley, <[email protected]> */
3*2d543d20SAndroid Build Coastguard Worker
4*2d543d20SAndroid Build Coastguard Worker /* FLASK */
5*2d543d20SAndroid Build Coastguard Worker
6*2d543d20SAndroid Build Coastguard Worker /*
7*2d543d20SAndroid Build Coastguard Worker * Implementation of the double-ended queue type.
8*2d543d20SAndroid Build Coastguard Worker */
9*2d543d20SAndroid Build Coastguard Worker
10*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
11*2d543d20SAndroid Build Coastguard Worker #include "queue.h"
12*2d543d20SAndroid Build Coastguard Worker
queue_create(void)13*2d543d20SAndroid Build Coastguard Worker queue_t queue_create(void)
14*2d543d20SAndroid Build Coastguard Worker {
15*2d543d20SAndroid Build Coastguard Worker queue_t q;
16*2d543d20SAndroid Build Coastguard Worker
17*2d543d20SAndroid Build Coastguard Worker q = (queue_t) malloc(sizeof(struct queue_info));
18*2d543d20SAndroid Build Coastguard Worker if (q == NULL)
19*2d543d20SAndroid Build Coastguard Worker return NULL;
20*2d543d20SAndroid Build Coastguard Worker
21*2d543d20SAndroid Build Coastguard Worker q->head = q->tail = NULL;
22*2d543d20SAndroid Build Coastguard Worker
23*2d543d20SAndroid Build Coastguard Worker return q;
24*2d543d20SAndroid Build Coastguard Worker }
25*2d543d20SAndroid Build Coastguard Worker
queue_insert(queue_t q,queue_element_t e)26*2d543d20SAndroid Build Coastguard Worker int queue_insert(queue_t q, queue_element_t e)
27*2d543d20SAndroid Build Coastguard Worker {
28*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t newnode;
29*2d543d20SAndroid Build Coastguard Worker
30*2d543d20SAndroid Build Coastguard Worker if (!q)
31*2d543d20SAndroid Build Coastguard Worker return -1;
32*2d543d20SAndroid Build Coastguard Worker
33*2d543d20SAndroid Build Coastguard Worker newnode = (queue_node_ptr_t) malloc(sizeof(struct queue_node));
34*2d543d20SAndroid Build Coastguard Worker if (newnode == NULL)
35*2d543d20SAndroid Build Coastguard Worker return -1;
36*2d543d20SAndroid Build Coastguard Worker
37*2d543d20SAndroid Build Coastguard Worker newnode->element = e;
38*2d543d20SAndroid Build Coastguard Worker newnode->next = NULL;
39*2d543d20SAndroid Build Coastguard Worker
40*2d543d20SAndroid Build Coastguard Worker if (q->head == NULL) {
41*2d543d20SAndroid Build Coastguard Worker q->head = q->tail = newnode;
42*2d543d20SAndroid Build Coastguard Worker } else {
43*2d543d20SAndroid Build Coastguard Worker q->tail->next = newnode;
44*2d543d20SAndroid Build Coastguard Worker q->tail = newnode;
45*2d543d20SAndroid Build Coastguard Worker }
46*2d543d20SAndroid Build Coastguard Worker
47*2d543d20SAndroid Build Coastguard Worker return 0;
48*2d543d20SAndroid Build Coastguard Worker }
49*2d543d20SAndroid Build Coastguard Worker
queue_push(queue_t q,queue_element_t e)50*2d543d20SAndroid Build Coastguard Worker int queue_push(queue_t q, queue_element_t e)
51*2d543d20SAndroid Build Coastguard Worker {
52*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t newnode;
53*2d543d20SAndroid Build Coastguard Worker
54*2d543d20SAndroid Build Coastguard Worker if (!q)
55*2d543d20SAndroid Build Coastguard Worker return -1;
56*2d543d20SAndroid Build Coastguard Worker
57*2d543d20SAndroid Build Coastguard Worker newnode = (queue_node_ptr_t) malloc(sizeof(struct queue_node));
58*2d543d20SAndroid Build Coastguard Worker if (newnode == NULL)
59*2d543d20SAndroid Build Coastguard Worker return -1;
60*2d543d20SAndroid Build Coastguard Worker
61*2d543d20SAndroid Build Coastguard Worker newnode->element = e;
62*2d543d20SAndroid Build Coastguard Worker newnode->next = NULL;
63*2d543d20SAndroid Build Coastguard Worker
64*2d543d20SAndroid Build Coastguard Worker if (q->head == NULL) {
65*2d543d20SAndroid Build Coastguard Worker q->head = q->tail = newnode;
66*2d543d20SAndroid Build Coastguard Worker } else {
67*2d543d20SAndroid Build Coastguard Worker newnode->next = q->head;
68*2d543d20SAndroid Build Coastguard Worker q->head = newnode;
69*2d543d20SAndroid Build Coastguard Worker }
70*2d543d20SAndroid Build Coastguard Worker
71*2d543d20SAndroid Build Coastguard Worker return 0;
72*2d543d20SAndroid Build Coastguard Worker }
73*2d543d20SAndroid Build Coastguard Worker
queue_remove(queue_t q)74*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_remove(queue_t q)
75*2d543d20SAndroid Build Coastguard Worker {
76*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t node;
77*2d543d20SAndroid Build Coastguard Worker queue_element_t e;
78*2d543d20SAndroid Build Coastguard Worker
79*2d543d20SAndroid Build Coastguard Worker if (!q)
80*2d543d20SAndroid Build Coastguard Worker return NULL;
81*2d543d20SAndroid Build Coastguard Worker
82*2d543d20SAndroid Build Coastguard Worker if (q->head == NULL)
83*2d543d20SAndroid Build Coastguard Worker return NULL;
84*2d543d20SAndroid Build Coastguard Worker
85*2d543d20SAndroid Build Coastguard Worker node = q->head;
86*2d543d20SAndroid Build Coastguard Worker q->head = q->head->next;
87*2d543d20SAndroid Build Coastguard Worker if (q->head == NULL)
88*2d543d20SAndroid Build Coastguard Worker q->tail = NULL;
89*2d543d20SAndroid Build Coastguard Worker
90*2d543d20SAndroid Build Coastguard Worker e = node->element;
91*2d543d20SAndroid Build Coastguard Worker free(node);
92*2d543d20SAndroid Build Coastguard Worker
93*2d543d20SAndroid Build Coastguard Worker return e;
94*2d543d20SAndroid Build Coastguard Worker }
95*2d543d20SAndroid Build Coastguard Worker
queue_head(queue_t q)96*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_head(queue_t q)
97*2d543d20SAndroid Build Coastguard Worker {
98*2d543d20SAndroid Build Coastguard Worker if (!q)
99*2d543d20SAndroid Build Coastguard Worker return NULL;
100*2d543d20SAndroid Build Coastguard Worker
101*2d543d20SAndroid Build Coastguard Worker if (q->head == NULL)
102*2d543d20SAndroid Build Coastguard Worker return NULL;
103*2d543d20SAndroid Build Coastguard Worker
104*2d543d20SAndroid Build Coastguard Worker return q->head->element;
105*2d543d20SAndroid Build Coastguard Worker }
106*2d543d20SAndroid Build Coastguard Worker
queue_destroy(queue_t q)107*2d543d20SAndroid Build Coastguard Worker void queue_destroy(queue_t q)
108*2d543d20SAndroid Build Coastguard Worker {
109*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t p, temp;
110*2d543d20SAndroid Build Coastguard Worker
111*2d543d20SAndroid Build Coastguard Worker if (!q)
112*2d543d20SAndroid Build Coastguard Worker return;
113*2d543d20SAndroid Build Coastguard Worker
114*2d543d20SAndroid Build Coastguard Worker p = q->head;
115*2d543d20SAndroid Build Coastguard Worker while (p != NULL) {
116*2d543d20SAndroid Build Coastguard Worker free(p->element);
117*2d543d20SAndroid Build Coastguard Worker temp = p;
118*2d543d20SAndroid Build Coastguard Worker p = p->next;
119*2d543d20SAndroid Build Coastguard Worker free(temp);
120*2d543d20SAndroid Build Coastguard Worker }
121*2d543d20SAndroid Build Coastguard Worker
122*2d543d20SAndroid Build Coastguard Worker free(q);
123*2d543d20SAndroid Build Coastguard Worker }
124*2d543d20SAndroid Build Coastguard Worker
queue_map(queue_t q,int (* f)(queue_element_t,void *),void * vp)125*2d543d20SAndroid Build Coastguard Worker int queue_map(queue_t q, int (*f) (queue_element_t, void *), void *vp)
126*2d543d20SAndroid Build Coastguard Worker {
127*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t p;
128*2d543d20SAndroid Build Coastguard Worker int ret;
129*2d543d20SAndroid Build Coastguard Worker
130*2d543d20SAndroid Build Coastguard Worker if (!q)
131*2d543d20SAndroid Build Coastguard Worker return 0;
132*2d543d20SAndroid Build Coastguard Worker
133*2d543d20SAndroid Build Coastguard Worker p = q->head;
134*2d543d20SAndroid Build Coastguard Worker while (p != NULL) {
135*2d543d20SAndroid Build Coastguard Worker ret = f(p->element, vp);
136*2d543d20SAndroid Build Coastguard Worker if (ret)
137*2d543d20SAndroid Build Coastguard Worker return ret;
138*2d543d20SAndroid Build Coastguard Worker p = p->next;
139*2d543d20SAndroid Build Coastguard Worker }
140*2d543d20SAndroid Build Coastguard Worker return 0;
141*2d543d20SAndroid Build Coastguard Worker }
142*2d543d20SAndroid Build Coastguard Worker
queue_map_remove_on_error(queue_t q,int (* f)(queue_element_t,void *),void (* g)(queue_element_t,void *),void * vp)143*2d543d20SAndroid Build Coastguard Worker void queue_map_remove_on_error(queue_t q,
144*2d543d20SAndroid Build Coastguard Worker int (*f) (queue_element_t, void *),
145*2d543d20SAndroid Build Coastguard Worker void (*g) (queue_element_t, void *), void *vp)
146*2d543d20SAndroid Build Coastguard Worker {
147*2d543d20SAndroid Build Coastguard Worker queue_node_ptr_t p, last, temp;
148*2d543d20SAndroid Build Coastguard Worker int ret;
149*2d543d20SAndroid Build Coastguard Worker
150*2d543d20SAndroid Build Coastguard Worker if (!q)
151*2d543d20SAndroid Build Coastguard Worker return;
152*2d543d20SAndroid Build Coastguard Worker
153*2d543d20SAndroid Build Coastguard Worker last = NULL;
154*2d543d20SAndroid Build Coastguard Worker p = q->head;
155*2d543d20SAndroid Build Coastguard Worker while (p != NULL) {
156*2d543d20SAndroid Build Coastguard Worker ret = f(p->element, vp);
157*2d543d20SAndroid Build Coastguard Worker if (ret) {
158*2d543d20SAndroid Build Coastguard Worker if (last) {
159*2d543d20SAndroid Build Coastguard Worker last->next = p->next;
160*2d543d20SAndroid Build Coastguard Worker if (last->next == NULL)
161*2d543d20SAndroid Build Coastguard Worker q->tail = last;
162*2d543d20SAndroid Build Coastguard Worker } else {
163*2d543d20SAndroid Build Coastguard Worker q->head = p->next;
164*2d543d20SAndroid Build Coastguard Worker if (q->head == NULL)
165*2d543d20SAndroid Build Coastguard Worker q->tail = NULL;
166*2d543d20SAndroid Build Coastguard Worker }
167*2d543d20SAndroid Build Coastguard Worker
168*2d543d20SAndroid Build Coastguard Worker temp = p;
169*2d543d20SAndroid Build Coastguard Worker p = p->next;
170*2d543d20SAndroid Build Coastguard Worker g(temp->element, vp);
171*2d543d20SAndroid Build Coastguard Worker free(temp);
172*2d543d20SAndroid Build Coastguard Worker } else {
173*2d543d20SAndroid Build Coastguard Worker last = p;
174*2d543d20SAndroid Build Coastguard Worker p = p->next;
175*2d543d20SAndroid Build Coastguard Worker }
176*2d543d20SAndroid Build Coastguard Worker }
177*2d543d20SAndroid Build Coastguard Worker
178*2d543d20SAndroid Build Coastguard Worker return;
179*2d543d20SAndroid Build Coastguard Worker }
180*2d543d20SAndroid Build Coastguard Worker
181*2d543d20SAndroid Build Coastguard Worker /* FLASK */
182