+/*
+ * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
/**
- * Simple, non circular, double linked pointer list.
- * Created because the properties of the standard circular list were not
- * very well suited for the interference graph implementation.
- * This list uses an obstack and a free-list to efficiently manage its
- * elements.
- * @author Kimon Hoffmann
- * @date 14.07.2005
- * @cvs-id $Id$
- * @note Until now the code is entirely untested so it probably contains
- * plenty of errors.
+ * @file
+ * @brief Simple, non circular, double linked pointer list.
+ * @note Created because the properties of the standard circular list were not
+ * very well suited for the interference graph implementation.
+ * This list uses an obstack and a free-list to efficiently manage its
+ * elements.
+ * @author Kimon Hoffmann
+ * @date 14.07.2005
+ * @version $Id$
*/
#include <stdlib.h>
return new_element;
}
-plist_t* plist_new(void) {
- plist_t* list = xmalloc(sizeof(*list));
+plist_t *plist_new(void) {
+ plist_t *list = xmalloc(sizeof(*list) + sizeof(*list->obst));
- obstack_init(list->obst);
+ list->obst = (struct obstack *)&list[1];
list->foreign_obstack = 0;
list->first_element = NULL;
list->last_element = NULL;
list->first_free_element = NULL;
list->element_count = 0;
+ obstack_init(list->obst);
return list;
}
}
}
-void plist_insert_back(plist_t* list, void* value) {
+void plist_insert_back(plist_t *list, void *value) {
if (list->last_element != NULL) {
plist_insert_after(list, list->last_element, value);
}
else {
- plist_element_t* newElement = allocate_element(list);
+ plist_element_t *newElement = allocate_element(list);
newElement->data = value;
newElement->prev = NULL;
}
}
-void plist_insert_front(plist_t* list, void* value) {
+void plist_insert_front(plist_t *list, void *value) {
if (list->first_element != NULL) {
plist_insert_before(list, list->first_element, value);
}
else {
- plist_element_t* newElement = allocate_element(list);
+ plist_element_t *newElement = allocate_element(list);
newElement->data = value;
newElement->prev = NULL;
}
}
-void plist_insert_before(plist_t* list, plist_element_t* element, void* value) {
- plist_element_t* prevElement;
- plist_element_t* newElement = allocate_element(list);
+void plist_insert_before(plist_t *list, plist_element_t *element, void *value) {
+ plist_element_t *prevElement;
+ plist_element_t *newElement = allocate_element(list);
newElement->data = value;
newElement->next = element;
}
void plist_insert_after(plist_t* list, plist_element_t* element, void* value) {
- plist_element_t* nextElement;
- plist_element_t* newElement = allocate_element(list);
+ plist_element_t *nextElement;
+ plist_element_t *newElement = allocate_element(list);
newElement->data = value;
newElement->prev = element;
++list->element_count;
}
+int plist_has_value(plist_t *list, void *value) {
+ plist_element_t *iter;
+
+ for (iter = plist_first(list); iter; iter = plist_element_get_next(iter)) {
+ if (plist_element_get_value(iter) == value)
+ return 1;
+ }
+
+ return 0;
+}
+
+plist_element_t *plist_find_value(plist_t *list, void *value) {
+ plist_element_t *iter;
+
+ for (iter = plist_first(list); iter; iter = plist_element_get_next(iter)) {
+ if (plist_element_get_value(iter) == value)
+ return iter;
+ }
+
+ return NULL;
+}
+
void plist_erase(plist_t *list, plist_element_t *element) {
plist_element_t *next_element = element->next;
plist_element_t *prev_element = element->prev;