diff options
Diffstat (limited to 'src/data/list.c')
| -rw-r--r-- | src/data/list.c | 80 |
1 files changed, 74 insertions, 6 deletions
diff --git a/src/data/list.c b/src/data/list.c index f751fa0..c90b5d4 100644 --- a/src/data/list.c +++ b/src/data/list.c @@ -1,13 +1,12 @@ /*:* *: File: ./src/data/list.c - *: A simple interpreter + *: A simple Fype interpreter *: - *: WWW : http://fype.buetow.org - *: AUTHOR : http://paul.buetow.org - *: E-Mail : fype at dev.buetow.org + *: WWW: http://fype.buetow.org + *: AUTHOR: http://paul.buetow.org + *: E-Mail: fype at dev.buetow.org *: - *: Copyright (c) 2005 - 2009, Dipl.-Inform. (FH) Paul C. Buetow - *: All rights reserved. + *: The Fype Language; (c) 2005 - 2010 Paul Buetow *: *: Redistribution and use in source and binary forms, with or without modi- *: fication, are permitted provided that the following conditions are met: @@ -343,6 +342,32 @@ listiterator_new(List *p_list) { } ListIterator* +listiterator_new_from_elem(ListElem *p_listelem) { + if (!p_listelem) + return (NULL); + + ListIterator *p_iter = malloc(sizeof(ListIterator)); + + p_iter->p_cur = p_listelem; + p_iter->b_reverse = false; + p_iter->func = NULL; + + return (p_iter); +} + +ListIterator* +listiterator_new_from_elem_reverse(ListElem *p_listelem) { + ListIterator *p_iter = listiterator_new_from_elem(p_listelem); + + if (!p_iter) + return (NULL); + + p_iter->b_reverse = true; + + return (p_iter); +} + +ListIterator* listiterator_new_reverse(List *p_list) { if (!p_list) return (NULL); @@ -411,6 +436,27 @@ listiterator_current(ListIterator *p_iter) { return (NULL); } +ListElem* +listiterator_current_elem(ListIterator *p_iter) { + if (p_iter->p_cur) + return (p_iter->p_cur); + + return (NULL); +} + +ListElem* +listiterator_prev_elem(ListIterator *p_iter) { + if (p_iter->p_cur) { + if (!p_iter->b_reverse) + return (p_iter->p_cur->p_prev); + + else + return (p_iter->p_cur->p_next); + } + + return (NULL); +} + void* listiterator_end(ListIterator *p_iter) { void *p_ret = NULL; @@ -421,6 +467,28 @@ listiterator_end(ListIterator *p_iter) { return (p_ret); } +_Bool +listiterator_current_elem_equals(ListIterator *p_iter, ListElem *p_listelem) { + if (!p_iter || !p_listelem) + return (false); + + ListElem *p_listelem_current = listiterator_current_elem(p_iter); + + if (!p_listelem_current) + return (false); + + else if (p_listelem_current->p_next != p_listelem->p_next) + return (false); + + else if (p_listelem_current->p_prev != p_listelem->p_prev) + return (false); + + else if (p_listelem_current->p_val != p_listelem->p_val) + return (false); + + return (true); +} + ListElem* listiterator_next_elem(ListIterator *p_iter) { if (p_iter->p_cur) { |
