#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <ntp_stdlib.h>
#include <ntp_prio_q.h>
queue *debug_create_priority_queue(
q_order_func get_order
#ifdef _CRTDBG_MAP_ALLOC
, const char * sourcefile
, int line_num
#endif
)
{
queue *my_queue;
#ifndef _CRTDBG_MAP_ALLOC
my_queue = emalloc(sizeof(queue));
#else
my_queue = debug_erealloc(NULL, sizeof(queue), sourcefile, line_num);
#endif
my_queue->get_order = get_order;
my_queue->front = NULL;
my_queue->no_of_elements = 0;
return my_queue;
}
void destroy_queue(
queue *my_queue
)
{
node *temp = NULL;
while (my_queue->front != NULL) {
temp = my_queue->front;
my_queue->front = my_queue->front->node_next;
free(temp);
}
free(my_queue);
}
void *debug_get_node(
size_t size
#ifdef _CRTDBG_MAP_ALLOC
, const char * sourcefile
, int line_num
#endif
)
{
node *new_node;
#ifndef _CRTDBG_MAP_ALLOC
new_node = emalloc(sizeof(*new_node) + size);
#else
new_node = debug_erealloc(NULL, sizeof(*new_node) + size,
sourcefile, line_num);
#endif
new_node->node_next = NULL;
return new_node + 1;
}
void free_node(
void *my_node
)
{
node *old_node = my_node;
free(old_node - 1);
}
void *
next_node(
void *pv
)
{
node *pn;
pn = pv;
pn--;
if (pn->node_next == NULL)
return NULL;
return pn->node_next + 1;
}
int empty(
queue *my_queue
)
{
return (!my_queue || !my_queue->front);
}
void *
queue_head(
queue *q
)
{
if (NULL == q || NULL == q->front)
return NULL;
return q->front + 1;
}
queue *enqueue(
queue * my_queue,
void * my_node
)
{
node *new_node = (node *)my_node - 1;
node *i = NULL;
node *j = my_queue->front;
while (j != NULL &&
(*my_queue->get_order)(new_node + 1, j + 1) > 0) {
i = j;
j = j->node_next;
}
if (i == NULL) {
new_node->node_next = my_queue->front;
my_queue->front = new_node;
} else {
new_node->node_next = i->node_next;
i->node_next = new_node;
}
++my_queue->no_of_elements;
return my_queue;
}
void *dequeue(
queue *my_queue
)
{
node *my_node = my_queue->front;
if (my_node != NULL) {
my_queue->front = my_node->node_next;
--my_queue->no_of_elements;
return my_node + 1;
} else
return NULL;
}
int get_no_of_elements(
queue *my_queue
)
{
return my_queue->no_of_elements;
}
void append_queue(
queue *q1,
queue *q2
)
{
while (!empty(q2))
enqueue(q1, dequeue(q2));
destroy_queue(q2);
}
int get_fifo_order(const void *el1, const void *el2)
{
return 1;
}