mirror of
https://github.com/UberGames/rpgxEF.git
synced 2024-11-10 15:21:34 +00:00
8632e3b72d
* removed unused cvars and related code * moved rpg_message cvars into timedmessages.cfg and removed the cvars * modified list module to support cyclic list access
140 lines
No EOL
4.2 KiB
C
140 lines
No EOL
4.2 KiB
C
/*
|
|
Copyright (c) 2011 Zhehao Mao
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
this software and associated documentation files (the "Software"), to deal in
|
|
the Software without restriction, including without limitation the rights to
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
of the Software, and to permit persons to whom the Software is furnished to do
|
|
so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef __LIBDS_LIST_H__
|
|
#define __LIBDS_LIST_H__
|
|
|
|
/* A C implementation of a doubly-linked list. Contains void pointer values.
|
|
Can be used as a LIFO stack of FIFO queue. */
|
|
|
|
#define FRONT 0
|
|
#define BACK 1
|
|
|
|
struct linked_node{
|
|
void* data;
|
|
struct linked_node* next;
|
|
struct linked_node* prev;
|
|
};
|
|
|
|
typedef struct linked_node* lnode_p;
|
|
|
|
struct list{
|
|
int length;
|
|
lnode_p first;
|
|
lnode_p last;
|
|
void (*destructor)(void*);
|
|
};
|
|
|
|
typedef struct list * list_p;
|
|
|
|
struct list_iter{
|
|
list_p list;
|
|
lnode_p current;
|
|
char started;
|
|
};
|
|
|
|
typedef struct list_iter * list_iter_p;
|
|
|
|
/**
|
|
* Create a linked_list object. This pointer is created on the heap and must be
|
|
* cleared with a call to destroy_list to avoid memory leaks
|
|
*/
|
|
list_p create_list(void);
|
|
|
|
/**
|
|
* Create a list_iter object for the linked_list list. The flag init can be
|
|
* either FRONT or BACK and indicates whether to start the iterator from the first
|
|
* or last item in the list
|
|
*/
|
|
list_iter_p list_iterator(list_p list, char init);
|
|
|
|
/**
|
|
* Add an item with the given value and size to the back of the list.
|
|
* The data is copied by value, so the original pointer must be freed if it
|
|
* was allocated on the heap.
|
|
*/
|
|
void list_add(list_p list, void* data, int size);
|
|
|
|
/**
|
|
* Gets the data stored in the first item of the list or NULL if the list is empty
|
|
*/
|
|
void* list_first(list_p list);
|
|
/**
|
|
* Gets the data stored in the last item of the list or NULL if the list is empty
|
|
*/
|
|
void* list_last(list_p list);
|
|
|
|
/**
|
|
* Removes the last item in the list (LIFO order) and returns the data stored
|
|
* there. The data returned must be freed later in order to remain memory safe.
|
|
*/
|
|
void* list_pop(list_p list);
|
|
/**
|
|
* Removes the first item in the list (FIFO order) and returns the data stored
|
|
* there. The data return must be freed later in order to remain memory safe.
|
|
*/
|
|
void* list_poll(list_p list);
|
|
/**
|
|
* Convenience function for completely destroying an item in the list. If the end
|
|
* flag is FRONT, an item will be polled from the front of the list and its data
|
|
* freed. If the end flag is set to BACK, an item will be popped off the end of
|
|
* the list and the data freed.
|
|
*/
|
|
void list_remove(list_p list, char end);
|
|
|
|
/**
|
|
* Completely free the data associated with the list.
|
|
*/
|
|
void destroy_list(list_p list);
|
|
|
|
/**
|
|
* Destroy a list iterator if allocated.
|
|
*/
|
|
void destroy_iterator(list_iter_p iter);
|
|
|
|
/**
|
|
* Return the data held by the current item pointed to by the iterator
|
|
*/
|
|
void* list_current(list_iter_p list);
|
|
/**
|
|
* Advances the iterator to the next item in the list and returns the data
|
|
* stored there.
|
|
*/
|
|
void* list_next(list_iter_p list);
|
|
/**
|
|
* Advances the iterator to the previous item in the list and returns the data
|
|
* stored there.
|
|
*/
|
|
void* list_prev(list_iter_p list);
|
|
/**
|
|
* Advances the iterator to the next item in the list and returns the data
|
|
* stored there. If the end of the list is reached it continues with the first
|
|
* element of the list.
|
|
*/
|
|
void* list_cycl_next(list_iter_p list);
|
|
/**
|
|
* Advances the iterator to the previous item in the list and returns the data
|
|
* stored there. If the start of the list is reached it continues with the last
|
|
* element of the list.
|
|
*/
|
|
void* list_cycl_prev(list_iter_p list);
|
|
|
|
#endif |