12 struct Queue * createQueue() {
13 struct Queue * queue = (struct Queue *)RUNMALLOC(sizeof(struct Queue));
19 void freeQueue(struct Queue * q) {
23 struct QueueItem * addNewItem(struct Queue * queue, void * ptr) {
24 struct QueueItem * item=RUNMALLOC(sizeof(struct QueueItem));
27 if (queue->head==NULL) {
33 item->next=queue->head;
35 queue->head->prev=item;
41 struct QueueItem * addNewItemBack(struct Queue * queue, void * ptr) {
42 struct QueueItem * item=RUNMALLOC(sizeof(struct QueueItem));
45 if (queue->tail==NULL) {
51 item->prev=queue->tail;
53 queue->tail->next=item;
60 struct QueueItem * addNewItem_I(struct Queue * queue, void * ptr) {
61 struct QueueItem * item=RUNMALLOC_I(sizeof(struct QueueItem));
64 if (queue->head==NULL) {
68 item->next=queue->head;
69 queue->head->prev=item;
76 struct QueueItem * getTail(struct Queue * queue) {
80 struct QueueItem * getHead(struct Queue * queue) {
84 struct QueueItem * getNextQueueItem(struct QueueItem * qi) {
88 struct QueueItem * findItem(struct Queue * queue, void *ptr) {
89 struct QueueItem * item=queue->head;
91 if (item->objectptr==ptr)
98 void removeItem(struct Queue * queue, struct QueueItem * item) {
99 struct QueueItem * prev=item->prev;
100 struct QueueItem * next=item->next;
101 if (queue->head==item)
105 if (queue->tail==item)
112 void * getItem(struct Queue * queue) {
113 struct QueueItem * q=queue->head;
114 void * ptr=q->objectptr;
115 if(queue->tail==queue->head) {
121 if(queue->tail == q) {
128 void * getItemBack(struct Queue * queue) {
129 struct QueueItem * q=queue->tail;
130 void * ptr=q->objectptr;
131 if(queue->head==queue->tail) {
141 void * peekItem(struct Queue * queue) {
142 struct QueueItem * q=queue->head;
143 void * ptr=q->objectptr;
147 void * peekItemBack(struct Queue * queue) {
148 struct QueueItem * q=queue->tail;
149 void * ptr=q->objectptr;
153 void clearQueue(struct Queue * queue) {
154 struct QueueItem * item=queue->head;
156 struct QueueItem * next=item->next;
160 queue->head=queue->tail=NULL;
165 int assertQueue(struct Queue * queue) {
167 struct QueueItem* i = queue->head;
169 if( i == NULL && queue->tail != NULL ) {
175 if( queue->head == i && i->prev != NULL ) {
179 if( i->prev == NULL ) {
180 if( queue->head != i ) {
186 if( i->prev->next == NULL ) {
188 } else if( i->prev->next != i ) {
193 if( i->next == NULL ) {
194 if( queue->tail != i ) {
200 if( i->next->prev == NULL ) {
202 } else if( i->next->prev != i ) {
207 if( queue->tail == i && i->next != NULL ) {
211 i = getNextQueueItem(i);
217 void printQueue(struct Queue * queue) {
220 printf("Queue empty? %d\n", isEmpty(queue));
226 i = getNextQueueItem(i);
230 printf("[%08x] ", (int)queue->head);
233 printf("[%08x] ", (int)i);
234 i = getNextQueueItem(i);
236 printf("[%08x]\n", (int)queue->tail);
241 printf("[%08x] ", (int)(i->next));
242 i = getNextQueueItem(i);
249 printf("[%08x] ", (int)(i->prev));
250 i = getNextQueueItem(i);