view src/queue.c @ 9:abdba37f67a2

Red-black tree in progress. Linked list needs iterators redone, also in progress. Sleepy.
author Eris Caffee <discordia@eldalin.com>
date Fri, 28 Sep 2012 03:08:25 -0500
parents 392ce56806f9
children 68f85ffc6029
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 * queue_new(size_t const max)
16 {
17 if (max < 1)
18 {
19 errno = EINVAL;
20 return NULL;
21 }
23 struct queue * queue = malloc(sizeof(struct queue));
24 if (NULL == queue)
25 return NULL;
27 queue->start = queue->count = 0;
28 queue->max = max;
30 queue->data = calloc(queue->max, sizeof(void *));
31 if (NULL == queue->data)
32 {
33 free(queue);
34 return NULL;
35 }
37 return queue;
38 }
40 ////////////////////////////////////////////////////////////////////////////////
41 // Returns:
42 // NULL on error
43 // elem on success and the buffer is not full
44 // the overwritten element on success if the buffer was full
45 void * queue_push(struct queue * queue, void * elem)
46 {
47 if ((NULL == queue) || (NULL == elem))
48 {
49 errno = EINVAL;
50 return NULL;
51 }
53 if (queue->count == queue->max)
54 {
55 errno = ENOMEM;
56 return NULL;
57 }
59 size_t end = (queue->start + queue->count) % queue->max;
61 queue->data[end] = elem;
62 queue->count++;
64 return elem;
65 }
67 ////////////////////////////////////////////////////////////////////////////////
68 void * queue_pop(struct queue * queue)
69 {
70 if (NULL == queue)
71 {
72 errno = EINVAL;
73 return NULL;
74 }
76 if (0 == queue->count)
77 return NULL;
79 void * t = queue->data[queue->start];
80 queue->count--;
81 queue->start = (queue->start + 1) % queue->max;
83 return t;
84 }
86 ////////////////////////////////////////////////////////////////////////////////
87 size_t queue_size(struct queue * queue)
88 {
89 if (NULL == queue)
90 {
91 errno = EINVAL;
92 return -1;
93 }
95 return queue->count;
96 }
98 ////////////////////////////////////////////////////////////////////////////////
99 void queue_delete(struct queue * queue)
100 {
101 if (NULL != queue) free(queue->data);
102 free(queue);
103 }