have linear-type-safe source codes of mp3decoder
[IRC.git] / Robust / src / Tests / setjmpTest / Queue.c
1 #include <stdlib.h>
2 #include "Queue.h"
3
4 struct Queue * createQueue() {
5   struct Queue * queue = (struct Queue *)malloc(sizeof(struct Queue));
6   queue->head = NULL;
7   queue->tail = NULL;
8   return queue;
9 }
10
11 void freeQueue(struct Queue * q) {
12   free(q);
13 }
14
15 struct QueueItem * addNewItem(struct Queue * queue, void * ptr) {
16   struct QueueItem * item=malloc(sizeof(struct QueueItem));
17   item->objectptr=ptr;
18   item->queue=queue;
19   if (queue->head==NULL) {
20     queue->head=item;
21     queue->tail=item;
22   } else {
23     item->next=queue->head;
24     queue->head->prev=item;
25     queue->head=item;
26   }
27   return item;
28 }
29
30 #ifdef RAW
31 struct QueueItem * addNewItem_I(struct Queue * queue, void * ptr) {
32   struct QueueItem * item=malloc_I(sizeof(struct QueueItem));
33   item->objectptr=ptr;
34   item->queue=queue;
35   if (queue->head==NULL) {
36     queue->head=item;
37     queue->tail=item;
38   } else {
39     item->next=queue->head;
40     queue->head->prev=item;
41     queue->head=item;
42   }
43   return item;
44 }
45 #endif
46
47 struct QueueItem * findItem(struct Queue * queue, void *ptr) {
48   struct QueueItem * item=queue->head;
49   while(item!=NULL) {
50     if (item->objectptr==ptr)
51       return item;
52     item=item->next;
53   }
54   return NULL;
55 }
56
57 void removeItem(struct Queue * queue, struct QueueItem * item) {
58   struct QueueItem * prev=item->prev;
59   struct QueueItem * next=item->next;
60   if (queue->head==item)
61     queue->head=next;
62   else
63     prev->next=next;
64   if (queue->tail==item)
65     queue->tail=prev;
66   else
67     next->prev=prev;
68   free(item);
69 }
70
71 struct QueueItem * getTail(struct Queue * queue) {
72   return queue->tail;
73 }
74
75 struct QueueItem * getNextQueueItem(struct QueueItem * qi) {
76   return qi->next;
77 }
78
79 void * getItem(struct Queue * queue) {
80   struct QueueItem * q=queue->head;
81   void * ptr=q->objectptr;
82   queue->head=q->next;
83   free(q);
84   return ptr;
85 }