mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-18 18:41:57 +00:00
89 lines
1.7 KiB
C
89 lines
1.7 KiB
C
|
// SONIC ROBO BLAST 2
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Copyright (C) 2003 by James Haley
|
||
|
// Copyright (C) 2003-2014 by Sonic Team Junior.
|
||
|
//
|
||
|
// This program is free software distributed under the
|
||
|
// terms of the GNU General Public License, version 2.
|
||
|
// See the 'LICENSE' file for more details.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
/// \file m_queue.c
|
||
|
/// \brief General queue code
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include "z_zone.h"
|
||
|
#include "m_queue.h"
|
||
|
#include "m_misc.h"
|
||
|
|
||
|
//
|
||
|
// M_QueueInit
|
||
|
//
|
||
|
// Sets up a queue. Can be called again to reset a used queue
|
||
|
// structure.
|
||
|
//
|
||
|
void M_QueueInit(mqueue_t *queue)
|
||
|
{
|
||
|
queue->head.next = NULL;
|
||
|
queue->tail = &(queue->head);
|
||
|
queue->rover = &(queue->head);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// M_QueueInsert
|
||
|
//
|
||
|
// Inserts the given item into the queue.
|
||
|
//
|
||
|
void M_QueueInsert(mqueueitem_t *item, mqueue_t *queue)
|
||
|
{
|
||
|
// link in at the tail (this works even for the first node!)
|
||
|
queue->tail = queue->tail->next = item;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// M_QueueIterator
|
||
|
//
|
||
|
// Returns the next item in the queue each time it is called,
|
||
|
// or NULL once the end is reached. The iterator can be reset
|
||
|
// using M_QueueResetIterator.
|
||
|
//
|
||
|
mqueueitem_t *M_QueueIterator(mqueue_t *queue)
|
||
|
{
|
||
|
if (queue->rover == NULL)
|
||
|
return NULL;
|
||
|
|
||
|
return (queue->rover = queue->rover->next);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// M_QueueResetIterator
|
||
|
//
|
||
|
// Returns the queue iterator to the beginning.
|
||
|
//
|
||
|
void M_QueueResetIterator(mqueue_t *queue)
|
||
|
{
|
||
|
queue->rover = &(queue->head);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// M_QueueFree
|
||
|
//
|
||
|
// Frees all the elements in the queue
|
||
|
//
|
||
|
void M_QueueFree(mqueue_t *queue)
|
||
|
{
|
||
|
mqueueitem_t *rover = queue->head.next;
|
||
|
|
||
|
while (rover)
|
||
|
{
|
||
|
mqueueitem_t *next = rover->next;
|
||
|
free(rover);
|
||
|
|
||
|
rover = next;
|
||
|
}
|
||
|
|
||
|
M_QueueInit(queue);
|
||
|
}
|
||
|
|
||
|
// EOF
|