summaryrefslogtreecommitdiff
path: root/src/data/list.h
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2010-05-09 09:30:29 +0000
committerPaul Buetow <paul@buetow.org>2010-05-09 09:30:29 +0000
commita90467d4be3bcf91cab299b4521bf5f762abb1d5 (patch)
tree5171d406e6be467807a914ce42923ac997d74858 /src/data/list.h
added the scheme branch
Diffstat (limited to 'src/data/list.h')
-rw-r--r--src/data/list.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/data/list.h b/src/data/list.h
new file mode 100644
index 0000000..fb6a9b8
--- /dev/null
+++ b/src/data/list.h
@@ -0,0 +1,118 @@
+/*:*
+ *: File: ./src/data/list.h
+ *: A simple Fype interpreter
+ *:
+ *: WWW: http://fype.buetow.org
+ *: AUTHOR: http://paul.buetow.org
+ *: E-Mail: fype at dev.buetow.org
+ *:
+ *: The Fype Language; (c) 2005 - 2010 - Dipl.-Inform. (FH) Paul C. Buetow
+ *:
+ *: Redistribution and use in source and binary forms, with or without modi-
+ *: fication, are permitted provided that the following conditions are met:
+ *: * Redistributions of source code must retain the above copyright
+ *: notice, this list of conditions and the following disclaimer.
+ *: * Redistributions in binary form must reproduce the above copyright
+ *: notice, this list of conditions and the following disclaimer in the
+ *: documentation and/or other materials provided with the distribution.
+ *: * Neither the name of buetow.org nor the names of its contributors may
+ *: be used to endorse or promote products derived from this software
+ *: without specific prior written permission.
+ *:
+ *: THIS SOFTWARE IS PROVIDED BY PAUL C. BUETOW AS IS'' AND ANY EXPRESS OR
+ *: IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ *: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *: DISCLAIMED. IN NO EVENT SHALL PAUL C. BUETOW BE LIABLE FOR ANY DIRECT,
+ *: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ *: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ *: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ *: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ *: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *: POSSIBILITY OF SUCH DAMAGE.
+ *:*/
+
+#ifndef LIST_H
+#define LIST_H
+
+#include <stdlib.h>
+
+#include "../defines.h"
+
+#define list_first(l) l->p_first->p_val
+#define list_last(l) l->p_last->p_val
+#define listiterator_set_callback(i,cb) i->func = cb
+
+typedef struct ListElem_ {
+ struct ListElem_ *p_next;
+ struct ListElem_ *p_prev;
+ void *p_val;
+} ListElem;
+
+typedef struct {
+ ListElem *p_first;
+ ListElem *p_last;
+ unsigned i_size;
+} List;
+
+typedef struct {
+ ListElem *p_cur;
+ _Bool b_reverse;
+ void* (*func)(void *);
+} ListIterator;
+
+typedef struct {
+ ListElem *p_cur;
+ _Bool b_reverse;
+} ListIteratorState;
+
+List *list_new();
+List *list_copy(List *p_list);
+List *list_copy2(List *p_list, void* (*func)(void *));
+ListElem *listelem_new();
+_Bool list_empty(List *p_list);
+void list_concat_front(List *p_list1, List *p_list2);
+void list_concat_back(List *p_list1, List *p_list2);
+void list_add_front(List *p_list, void *p_val);
+void list_add_back(List *p_list, void *p_val);
+void *list_remove_front(List *p_list);
+void *list_remove_back(List *p_list);
+void list_clear(List *p_list);
+void list_clear_and_free_vals(List *p_list);
+void list_delete(List *p_list);
+void list_delete_cb(void *p_list);
+void list_delete_and_free_vals(List *p_list);
+unsigned list_size(List *p_list);
+void list_iterate(List *p_list, void (*func)(void *));
+void list_iterate2_ptr(List *p_list,
+ void (*func)(void *, void *),
+ void *p_void);
+void list_iterate2(List *p_list,
+ void (*func)(void *, void *),
+ void *p_void);
+void list_iterate3(List *p_list,
+ void (*func)(void *, void *, void *),
+ void *p_void1, void *p_void2);
+void list_iterate3_ptr(List *p_list,
+ void (*func)(void *, void *, void *),
+ void *p_void1, void *p_void2);
+ListIterator* listiterator_new(List *p_list);
+ListIterator* listiterator_new_from_elem(ListElem *p_listelem);
+ListIterator* listiterator_new_from_elem_reverse(ListElem *p_listelem);
+ListIterator* listiterator_new_reverse(List *p_list);
+void listiterator_delete(ListIterator *p_iter);
+void* listiterator_next(ListIterator *p_iter);
+void* listiterator_prev(ListIterator *p_iter);
+void* listiterator_current(ListIterator *p_iter);
+ListElem* listiterator_current_elem(ListIterator *p_iter);
+ListElem* listiterator_prev_elem(ListIterator *p_iter);
+void* listiterator_end(ListIterator *p_iter);
+_Bool listiterator_has_next(ListIterator *p_iter);
+_Bool listiterator_current_elem_equals(ListIterator *p_iter, ListElem *p_listelem);
+ListElem* listiterator_next_elem(ListIterator *p_iter);
+void list_remove_elem(List *p_list, ListElem *p_elem_remove);
+ListIteratorState* listiterator_get_state(ListIterator *p_iter);
+void listiterator_set_state(ListIterator *p_iter, ListIteratorState *p_state);
+void listiteratorstate_delete(ListIteratorState *p_state);
+
+#endif