view src/queue.c @ 1:392ce56806f9

Added dequeue, cmake file, fix copypasta in queue
author Eris Caffee <discordia@eldalin.com>
date Thu, 20 Sep 2012 23:11:40 -0500
parents 5af32066927f
children abdba37f67a2
line source
1 #include <stdlib.h>
2 #include <errno.h>
4 #include "queue.h"
6 ////////////////////////////////////////////////////////////////////////////////
7 struct queue * queue_new(size_t const max)
8 {
9 if (max < 1)
10 {
11 errno = EINVAL;
12 return NULL;
13 }
15 struct queue * queue = malloc(sizeof(struct queue));
16 if (NULL == queue)
17 return NULL;
19 queue->start = queue->count = 0;
20 queue->max = max;
22 queue->data = calloc(queue->max, sizeof(void *));
23 if (NULL == queue->data)
24 {
25 free(queue);
26 return NULL;
27 }
29 return queue;
30 }
32 ////////////////////////////////////////////////////////////////////////////////
33 // Returns:
34 // NULL on error
35 // elem on success and the buffer is not full
36 // the overwritten element on success if the buffer was full
37 void * queue_push(struct queue * queue, void * elem)
38 {
39 if ((NULL == queue) || (NULL == elem))
40 {
41 errno = EINVAL;
42 return NULL;
43 }
45 if (queue->count == queue->max)
46 {
47 errno = ENOMEM;
48 return NULL;
49 }
51 size_t end = (queue->start + queue->count) % queue->max;
53 queue->data[end] = elem;
54 queue->count++;
56 return elem;
57 }
59 ////////////////////////////////////////////////////////////////////////////////
60 void * queue_pop(struct queue * queue)
61 {
62 if (NULL == queue)
63 {
64 errno = EINVAL;
65 return NULL;
66 }
68 if (0 == queue->count)
69 return NULL;
71 void * t = queue->data[queue->start];
72 queue->count--;
73 queue->start = (queue->start + 1) % queue->max;
75 return t;
76 }
78 ////////////////////////////////////////////////////////////////////////////////
79 size_t queue_size(struct queue * queue)
80 {
81 if (NULL == queue)
82 {
83 errno = EINVAL;
84 return -1;
85 }
87 return queue->count;
88 }
90 ////////////////////////////////////////////////////////////////////////////////
91 void queue_delete(struct queue * queue)
92 {
93 if (NULL != queue) free(queue->data);
94 free(queue);
95 }