move around - flatter.
[profile/ivi/evas.git] / src / lib / data / evas_object_list.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include "config.h"
7 #endif
8
9 #include <stdlib.h>
10
11 #include "Evas_Data.h"
12
13 /* list ops */
14 void *
15 evas_object_list_append(void *in_list, void *in_item)
16 {
17    Evas_Object_List *l, *new_l;
18    Evas_Object_List *list;
19
20    list = in_list;
21    new_l = in_item;
22    new_l->next = NULL;
23    if (!list)
24      {
25         new_l->prev = NULL;
26         new_l->last = new_l;
27         return new_l;
28      }
29    if (list->last) l = list->last;
30    else for (l = list; (l) && (l->next); l = l->next);
31    l->next = new_l;
32    new_l->prev = l;
33    list->last = new_l;
34    return list;
35 }
36
37 void *
38 evas_object_list_prepend(void *in_list, void *in_item)
39 {
40    Evas_Object_List *new_l;
41    Evas_Object_List *list;
42
43    list = in_list;
44    new_l = in_item;
45    new_l->prev = NULL;
46    if (!list)
47      {
48         new_l->next = NULL;
49         new_l->last = new_l;
50         return new_l;
51      }
52    new_l->next = list;
53    list->prev = new_l;
54    new_l->last = list->last;
55    list->last = NULL;
56    return new_l;
57 }
58
59 void *
60 evas_object_list_append_relative(void *in_list, void *in_item, void *in_relative)
61 {
62    Evas_Object_List *list, *relative, *new_l;
63
64    list = in_list;
65    new_l = in_item;
66    relative = in_relative;
67    if (relative)
68      {
69         if (relative->next)
70           {
71              new_l->next = relative->next;
72              relative->next->prev = new_l;
73           }
74         else new_l->next = NULL;
75         relative->next = new_l;
76         new_l->prev = relative;
77         if (!new_l->next) list->last = new_l;
78         return list;
79      }
80    return evas_object_list_append(list, new_l);
81 }
82
83 void *
84 evas_object_list_prepend_relative(void *in_list, void *in_item, void *in_relative)
85 {
86    Evas_Object_List *list, *relative, *new_l;
87
88    list = in_list;
89    new_l = in_item;
90    relative = in_relative;
91    if (relative)
92      {
93         new_l->prev = relative->prev;
94         new_l->next = relative;
95         relative->prev = new_l;
96         if (new_l->prev)
97           {
98              new_l->prev->next = new_l;
99              if (!new_l->next)
100                list->last = new_l;
101              return list;
102           }
103         else
104           {
105              if (!new_l->next)
106                new_l->last = new_l;
107              else
108                {
109                   new_l->last = list->last;
110                   list->last = NULL;
111                }
112              return new_l;
113           }
114      }
115    return evas_object_list_prepend(list, new_l);
116 }
117
118 void *
119 evas_object_list_remove(void *in_list, void *in_item)
120 {
121    Evas_Object_List *return_l;
122    Evas_Object_List *list, *item;
123
124    /* checkme */
125    if(!in_list)
126      return in_list;
127
128    list = in_list;
129    item = in_item;
130    if (!item) return list;
131    if (item->next)
132      item->next->prev = item->prev;
133    if (item->prev)
134      {
135         item->prev->next = item->next;
136         return_l = list;
137      }
138    else
139      {
140         return_l = item->next;
141         if (return_l)
142           return_l->last = list->last;
143      }
144    if (item == list->last)
145      list->last = item->prev;
146    item->next = NULL;
147    item->prev = NULL;
148    return return_l;
149 }
150
151 void *
152 evas_object_list_find(void *in_list, void *in_item)
153 {
154    Evas_Object_List *l;
155    Evas_Object_List *list, *item;
156
157    list = in_list;
158    item = in_item;
159    for (l = list; l; l = l->next)
160      {
161         if (l == item) return item;
162      }
163    return NULL;
164 }