EFL 1.7 svn doobies
[profile/ivi/eina.git] / src / tests / evas_object_list.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4
5 #include <stdlib.h>
6
7 #include "Evas_Data.h"
8
9 /* list ops */
10 void *
11 evas_object_list_append(void *in_list, void *in_item)
12 {
13    Evas_Object_List *l, *new_l;
14    Evas_Object_List *list;
15
16    list = in_list;
17    new_l = in_item;
18    new_l->next = NULL;
19    if (!list)
20      {
21         new_l->prev = NULL;
22         new_l->last = new_l;
23         return new_l;
24      }
25
26    if (list->last)
27       l = list->last;
28    else
29       for (l = list; (l) && (l->next); l = l->next) ;
30
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
53    new_l->next = list;
54    list->prev = new_l;
55    new_l->last = list->last;
56    list->last = NULL;
57    return new_l;
58 }
59
60 void *
61 evas_object_list_append_relative(void *in_list,
62                                  void *in_item,
63                                  void *in_relative)
64 {
65    Evas_Object_List *list, *relative, *new_l;
66
67    list = in_list;
68    new_l = in_item;
69    relative = in_relative;
70    if (relative)
71      {
72         if (relative->next)
73           {
74              new_l->next = relative->next;
75              relative->next->prev = new_l;
76           }
77         else
78            new_l->next = NULL;
79
80         relative->next = new_l;
81         new_l->prev = relative;
82         if (!new_l->next)
83            list->last = new_l;
84
85         return list;
86      }
87
88    return evas_object_list_append(list, new_l);
89 }
90
91 void *
92 evas_object_list_prepend_relative(void *in_list,
93                                   void *in_item,
94                                   void *in_relative)
95 {
96    Evas_Object_List *list, *relative, *new_l;
97
98    list = in_list;
99    new_l = in_item;
100    relative = in_relative;
101    if (relative)
102      {
103         new_l->prev = relative->prev;
104         new_l->next = relative;
105         relative->prev = new_l;
106         if (new_l->prev)
107           {
108              new_l->prev->next = new_l;
109              if (!new_l->next)
110                 list->last = new_l;
111
112              return list;
113           }
114         else
115           {
116              if (!new_l->next)
117                 new_l->last = new_l;
118              else
119                {
120                   new_l->last = list->last;
121                   list->last = NULL;
122                }
123
124              return new_l;
125           }
126      }
127
128    return evas_object_list_prepend(list, new_l);
129 }
130
131 void *
132 evas_object_list_remove(void *in_list, void *in_item)
133 {
134    Evas_Object_List *return_l;
135    Evas_Object_List *list, *item;
136
137    /* checkme */
138    if(!in_list)
139       return in_list;
140
141    list = in_list;
142    item = in_item;
143    if (!item)
144       return list;
145
146    if (item->next)
147       item->next->prev = item->prev;
148
149    if (item->prev)
150      {
151         item->prev->next = item->next;
152         return_l = list;
153      }
154    else
155      {
156         return_l = item->next;
157         if (return_l)
158            return_l->last = list->last;
159      }
160
161    if (item == list->last)
162       list->last = item->prev;
163
164    item->next = NULL;
165    item->prev = NULL;
166    return return_l;
167 }
168
169 void *
170 evas_object_list_find(void *in_list, void *in_item)
171 {
172    Evas_Object_List *l;
173    Evas_Object_List *list, *item;
174
175    list = in_list;
176    item = in_item;
177    for (l = list; l; l = l->next)
178      {
179         if (l == item)
180            return item;
181      }
182    return NULL;
183 }