view src/queue.c @ 10:68f85ffc6029

Finished rbtree. Reworked the iterators in list. Minor tweaks to others.
author Eris Caffee <discordia@eldalin.com>
date Fri, 28 Sep 2012 18:24:53 -0500
parents abdba37f67a2
children
line source
1 #include <stdlib.h>
2 #include <errno.h>
4 #include "queue.h"
6 struct queue
7 {
8 void ** data;
9 size_t max;
10 size_t start;
11 size_t count;
12 };
14 ////////////////////////////////////////////////////////////////////////////////
15 struct queue *
16 queue_new(size_t const max)
17 {
18 if (max < 1)
19 return NULL;
21 struct queue * queue = malloc(sizeof(struct queue));
22 if (NULL == queue)
23 return NULL;
25 queue->start = queue->count = 0;
26 queue->max = max;
28 queue->data = calloc(queue->max, sizeof(void *));
29 if (NULL == queue->data)
30 {
31 free(queue);
32 return NULL;
33 }
35 return queue;
36 }
38 ////////////////////////////////////////////////////////////////////////////////
39 // Returns:
40 // NULL on error
41 // elem on success and the buffer is not full
42 // the overwritten element on success if the buffer was full
43 void *
44 queue_push(struct queue * queue, void * elem)
45 {
46 if ((NULL == queue) || (NULL == elem))
47 return NULL;
49 if (queue->count == queue->max)
50 return NULL;
52 size_t end = (queue->start + queue->count) % queue->max;
54 queue->data[end] = elem;
55 queue->count++;
57 return elem;
58 }
60 ////////////////////////////////////////////////////////////////////////////////
61 void *
62 queue_pop(struct queue * queue)
63 {
64 if (NULL == queue)
65 return NULL;
67 if (0 == queue->count)
68 return NULL;
70 void * t = queue->data[queue->start];
71 queue->count--;
72 queue->start = (queue->start + 1) % queue->max;
74 return t;
75 }
77 ////////////////////////////////////////////////////////////////////////////////
78 size_t
79 queue_size(struct queue * queue)
80 {
81 if (NULL == queue)
82 return 0;
84 return queue->count;
85 }
87 ////////////////////////////////////////////////////////////////////////////////
88 void
89 queue_delete(struct queue * queue)
90 {
91 if (NULL != queue) free(queue->data);
92 free(queue);
93 }