125 lines
2.5 KiB
C
125 lines
2.5 KiB
C
/******************************************************************************
|
|
*
|
|
*
|
|
* @brief Implement a first in, first out linked list.
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#include "common.h"
|
|
#include "queue.h"
|
|
|
|
/********************************************************************/
|
|
/*
|
|
* Initialize the specified queue to an empty state
|
|
*
|
|
* Parameters:
|
|
* q Pointer to queue structure
|
|
*/
|
|
void
|
|
queue_init(QUEUE *q)
|
|
{
|
|
q->head = NULL;
|
|
}
|
|
/********************************************************************/
|
|
/*
|
|
* Check for an empty queue
|
|
*
|
|
* Parameters:
|
|
* q Pointer to queue structure
|
|
*
|
|
* Return Value:
|
|
* 1 if Queue is empty
|
|
* 0 otherwise
|
|
*/
|
|
int
|
|
queue_isempty(QUEUE *q)
|
|
{
|
|
return (q->head == NULL);
|
|
}
|
|
/********************************************************************/
|
|
/*
|
|
* Add an item to the end of the queue
|
|
*
|
|
* Parameters:
|
|
* q Pointer to queue structure
|
|
* node New node to add to the queue
|
|
*/
|
|
void
|
|
queue_add(QUEUE *q, QNODE *node)
|
|
{
|
|
if (queue_isempty(q))
|
|
{
|
|
q->head = q->tail = node;
|
|
}
|
|
else
|
|
{
|
|
q->tail->next = node;
|
|
q->tail = node;
|
|
}
|
|
|
|
node->next = NULL;
|
|
}
|
|
|
|
/********************************************************************/
|
|
/*
|
|
* Remove and return first (oldest) entry from the specified queue
|
|
*
|
|
* Parameters:
|
|
* q Pointer to queue structure
|
|
*
|
|
* Return Value:
|
|
* Node at head of queue - NULL if queue is empty
|
|
*/
|
|
QNODE*
|
|
queue_remove(QUEUE *q)
|
|
{
|
|
QNODE *oldest;
|
|
|
|
if (queue_isempty(q))
|
|
return NULL;
|
|
|
|
oldest = q->head;
|
|
q->head = oldest->next;
|
|
return oldest;
|
|
}
|
|
/********************************************************************/
|
|
/*
|
|
* Peek into the queue and return pointer to first (oldest) entry.
|
|
* The queue is not modified
|
|
*
|
|
* Parameters:
|
|
* q Pointer to queue structure
|
|
*
|
|
* Return Value:
|
|
* Node at head of queue - NULL if queue is empty
|
|
*/
|
|
QNODE*
|
|
queue_peek(QUEUE *q)
|
|
{
|
|
return q->head;
|
|
}
|
|
/********************************************************************/
|
|
/*
|
|
* Move entire contents of one queue to the other
|
|
*
|
|
* Parameters:
|
|
* src Pointer to source queue
|
|
* dst Pointer to destination queue
|
|
*/
|
|
void
|
|
queue_move(QUEUE *dst, QUEUE *src)
|
|
{
|
|
if (queue_isempty(src))
|
|
return;
|
|
|
|
if (queue_isempty(dst))
|
|
dst->head = src->head;
|
|
else
|
|
dst->tail->next = src->head;
|
|
|
|
dst->tail = src->tail;
|
|
src->head = NULL;
|
|
return;
|
|
}
|
|
/********************************************************************/
|