summaryrefslogtreecommitdiff
path: root/src/lib/eina_inlist.c
diff options
context:
space:
mode:
authorCedric BAIL <cedric.bail@free.fr>2008-07-30 12:46:55 +0000
committerCedric BAIL <cedric.bail@free.fr>2008-07-30 12:46:55 +0000
commitc667d23b40f7a6018e848969ff10785e5a7a5e81 (patch)
tree678db73bd630bce563ac0470438ba454a6a55458 /src/lib/eina_inlist.c
downloadeina-c667d23b40f7a6018e848969ff10785e5a7a5e81.tar.gz
Adding turran work to unify EFL data types and functions.
SVN revision: 35248
Diffstat (limited to 'src/lib/eina_inlist.c')
-rw-r--r--src/lib/eina_inlist.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/lib/eina_inlist.c b/src/lib/eina_inlist.c
new file mode 100644
index 0000000..582a714
--- /dev/null
+++ b/src/lib/eina_inlist.c
@@ -0,0 +1,161 @@
+#include "Eina.h"
+#include "eina_private.h"
+
+/* TODO please, refactor this :) */
+
+/*============================================================================*
+ * API *
+ *============================================================================*/
+/**
+ * To be documented
+ * FIXME: To be fixed
+ */
+EAPI void * eina_inlist_append(void *in_list, void *in_item) {
+ Eina_Inlist *l, *new_l;
+ Eina_Inlist *list;
+
+ list = in_list;
+ new_l = in_item;
+ new_l->next = NULL;
+ if (!list) {
+ new_l->prev = NULL;
+ new_l->last = new_l;
+ return new_l;
+ }
+ if (list->last)
+ l = list->last;
+ else
+ for (l = list; (l) && (l->next); l = l->next)
+ ;
+ l->next = new_l;
+ new_l->prev = l;
+ list->last = new_l;
+ return list;
+}
+/**
+ * To be documented
+ * FIXME: To be fixed
+ */
+EAPI void * eina_inlist_prepend(void *in_list, void *in_item) {
+ Eina_Inlist *new_l;
+ Eina_Inlist *list;
+
+ list = in_list;
+ new_l = in_item;
+ new_l->prev = NULL;
+ if (!list) {
+ new_l->next = NULL;
+ new_l->last = new_l;
+ return new_l;
+ }
+ new_l->next = list;
+ list->prev = new_l;
+ new_l->last = list->last;
+ list->last = NULL;
+ return new_l;
+}
+/**
+ * To be documented
+ * FIXME: To be fixed
+ */
+EAPI void * eina_inlist_append_relative(void *in_list, void *in_item,
+ void *in_relative) {
+ Eina_Inlist *list, *relative, *new_l;
+
+ list = in_list;
+ new_l = in_item;
+ relative = in_relative;
+ if (relative) {
+ if (relative->next) {
+ new_l->next = relative->next;
+ relative->next->prev = new_l;
+ } else
+ new_l->next = NULL;
+ relative->next = new_l;
+ new_l->prev = relative;
+ if (!new_l->next)
+ list->last = new_l;
+ return list;
+ }
+ return eina_inlist_append(list, new_l);
+}
+/**
+ * To be documented
+ * FIXME: To be fixed
+ */
+EAPI void * eina_inlist_prepend_relative(void *in_list, void *in_item,
+ void *in_relative) {
+ Eina_Inlist *list, *relative, *new_l;
+
+ list = in_list;
+ new_l = in_item;
+ relative = in_relative;
+ if (relative) {
+ new_l->prev = relative->prev;
+ new_l->next = relative;
+ relative->prev = new_l;
+ if (new_l->prev) {
+ new_l->prev->next = new_l;
+ if (!new_l->next)
+ list->last = new_l;
+ return list;
+ } else {
+ if (!new_l->next)
+ new_l->last = new_l;
+ else {
+ new_l->last = list->last;
+ list->last = NULL;
+ }
+ return new_l;
+ }
+ }
+ return eina_inlist_prepend(list, new_l);
+}
+/**
+ * To be documented
+ * FIXME: To be fixed
+ */
+EAPI void * eina_inlist_remove(void *in_list, void *in_item) {
+ Eina_Inlist *return_l;
+ Eina_Inlist *list, *item;
+
+ /* checkme */
+ if (!in_list)
+ return in_list;
+
+ list = in_list;
+ item = in_item;
+ if (!item)
+ return list;
+ if (item->next)
+ item->next->prev = item->prev;
+ if (item->prev) {
+ item->prev->next = item->next;
+ return_l = list;
+ } else {
+ return_l = item->next;
+ if (return_l)
+ return_l->last = list->last;
+ }
+ if (item == list->last)
+ list->last = item->prev;
+ item->next = NULL;
+ item->prev = NULL;
+ return return_l;
+}
+/**
+ * To be documented
+ * FIXME: To be fixed
+ */
+EAPI void * eina_inlist_find(void *in_list, void *in_item) {
+ Eina_Inlist *l;
+ Eina_Inlist *list, *item;
+
+ list = in_list;
+ item = in_item;
+ for (l = list; l; l = l->next) {
+ if (l == item)
+ return item;
+ }
+ return NULL;
+}