* This list uses an obstack and a free-list to efficiently manage its
* elements.
* @author Kimon Hoffmann
- * @date 17.07.2005
+ * @date 14.07.2005
* @note Until now the code is entirely untested so it probably contains
* plenty of errors.
*/
#include <stdlib.h>
-#include "obst.h"
#include "plist.h"
-/**
- * Structure for one entry of the double linked pointer list.
- */
-struct PListElement {
- PListElement* next;
- PListElement* prev;
- void* data;
-};
-
-/**
- * The list data type.
- */
-struct PList {
- /**
- * The obastack used for all allocations.
- */
- struct obstack obst;
- /**
- * First element in the list.
- */
- PListElement* firstElement;
- /**
- * Last element in the list.
- */
- PListElement* lastElement;
- /**
- * Current numner of elements in the list.
- */
- int elementCount;
- /**
- * First element in the free list.
- * Please note that the free list is a single linked list and all back
- * references are invalid.
- */
- PListElement* firstFreeElement;
-};
-
/**
* Helper macro that returns a new uninitialized list element by either
* fetching one from the free-list or allocating a new one on the lists
* obstack.
* @param list the list for which to allocate the element.
- * @return the newlyallocated, uninitialized element.
+ * @return the newly allocated, uninitialized element.
*/
static PListElement* allocate_element(PList* list) {
PListElement* newElement;
}
void plist_insert_before(PList* list, PListElement* element, void* value) {
+ PListElement* prevElement;
PListElement* newElement = allocate_element(list);
+
newElement->data = value;
newElement->next = element;
- PListElement* prevElement = element->prev;
+ prevElement = element->prev;
newElement->prev = prevElement;
if (prevElement != NULL) {
prevElement->next = newElement;
}
void plist_insert_after(PList* list, PListElement* element, void* value) {
+ PListElement* nextElement;
PListElement* newElement = allocate_element(list);
+
newElement->data = value;
newElement->prev = element;
- PListElement* nextElement = element->next;
+ nextElement = element->next;
newElement->next = nextElement;
if (nextElement != NULL) {
nextElement->prev = newElement;
}
--list->elementCount;
/* Clean the element and prepend it to the free list */
- element->prev = NULL; /* The allocation code exprects prev to be NULL */
+ element->prev = NULL; /* The allocation code expects prev to be NULL */
element->next = list->firstFreeElement;
list->firstFreeElement = element;
}