skipstone/src/queue.c-e

87 lines
1.4 KiB
Text
Raw Normal View History

2017-11-23 17:22:36 +00:00
#include <stdlib.h>
#include <skipstone/queue.h>
struct entry {
void *value;
struct entry *next, *prev;
};
struct _skipstone_queue {
size_t count;
struct entry *last;
};
skipstone_queue *skipstone_queue_new() {
skipstone_queue *queue;
if ((queue = malloc(sizeof(*queue))) == NULL) {
goto error_malloc_queue;
}
queue->count = 0;
queue->last = NULL;
return queue;
error_malloc_queue:
return NULL;
}
void skipstone_queue_destroy(skipstone_queue *queue) {
while (queue->last) {
struct entry *entry = queue->last;
queue->last = entry->prev;
free(entry);
}
free(queue);
}
2017-11-23 17:22:36 +00:00
size_t skipstone_queue_count(skipstone_queue *queue) {
return queue->count;
}
int skipstone_queue_push(skipstone_queue *queue, void *value) {
struct entry *next;
2017-11-23 18:24:16 +00:00
if ((next = malloc(sizeof(*next))) == NULL) {
2017-11-23 17:22:36 +00:00
goto error_malloc_next;
}
next->value = value;
next->next = NULL;
next->prev = queue->last;
if (queue->last) {
next->prev = queue->last;
queue->last->next = next;
}
2017-11-23 17:22:36 +00:00
queue->last = next;
2017-11-24 02:27:57 +00:00
queue->count++;
2017-11-23 17:22:36 +00:00
return 0;
error_malloc_next:
return -1;
}
int skipstone_queue_pop(skipstone_queue *queue, void **value) {
struct entry *last = queue->last;
2017-11-24 02:27:57 +00:00
if (queue->count == 0) {
2017-11-23 17:22:36 +00:00
return 0;
}
2017-11-24 02:27:57 +00:00
*value = last->value;
2017-11-23 17:22:36 +00:00
queue->last = last->prev;
2017-11-24 02:27:57 +00:00
queue->count--;
2017-11-23 17:22:36 +00:00
free(last);
2017-11-23 18:02:38 +00:00
return 1;
2017-11-23 17:22:36 +00:00
}