001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018 #ifndef _SOS_LIST_H_
019 #define _SOS_LIST_H_
020
021
022
023
024
025
026
027
028
029
030
031
032
033 #define list_init_named(list,prev,next) \
034 ((list) = NULL)
035
036 #define list_singleton_named(list,item,prev,next) ({ \
037 (item)->next = (item)->prev = (item); \
038 (list) = (item); \
039 })
040
041 #define list_is_empty_named(list,prev,next) \
042 ((list) == NULL)
043
044 #define list_get_head_named(list,prev,next) \
045 (list)
046
047 #define list_get_tail_named(list,prev,next) \
048 ((list)?((list)->prev):NULL)
049
050
051 #define __list_insert_atleft_named(before_this,item,prev,next) ({ \
052 (before_this)->prev->next = (item); \
053 (item)->prev = (before_this)->prev; \
054 (before_this)->prev = (item); \
055 (item)->next = (before_this); \
056 })
057
058
059 #define list_insert_before_named(list,before_this,item,prev,next) ({ \
060 __list_insert_atleft_named(before_this,item,prev,next); \
061 if ((list) == (before_this)) (list) = (item); \
062 })
063
064
065 #define list_insert_after_named(list,after_this,item,prev,next) ({ \
066 (after_this)->next->prev = (item); \
067 (item)->next = (after_this)->next; \
068 (after_this)->next = (item); \
069 (item)->prev = (after_this); \
070 })
071
072 #define list_add_head_named(list,item,prev,next) ({ \
073 if (list) \
074 list_insert_before_named(list,list,item,prev,next); \
075 else \
076 list_singleton_named(list,item,prev,next); \
077 (list) = (item); \
078 })
079
080 #define list_add_tail_named(list,item,prev,next) ({ \
081 if (list) \
082 __list_insert_atleft_named(list,item,prev,next); \
083 else \
084 list_singleton_named(list,item,prev,next); \
085 })
086
087
088 #define list_delete_named(list,item,prev,next) ({ \
089 if ( ((item)->next == (item)) && ((item)->prev == (item)) ) \
090 (item)->next = (item)->prev = (list) = NULL; \
091 else { \
092 (item)->prev->next = (item)->next; \
093 (item)->next->prev = (item)->prev; \
094 if ((item) == (list)) (list) = (item)->next; \
095 (item)->prev = (item)->next = NULL; \
096 } \
097 })
098
099 #define list_pop_head_named(list,prev,next) ({ \
100 typeof(list) __ret_elt = (list); \
101 list_delete_named(list,__ret_elt,prev,next); \
102 __ret_elt; })
103
104
105
106 #define list_foreach_forward_named(list,iterator,nb_elements,prev,next) \
107 for (nb_elements=0, (iterator) = (list) ; \
108 (iterator) && (!nb_elements || ((iterator) != (list))) ; \
109 nb_elements++, (iterator) = (iterator)->next )
110
111
112
113 #define list_foreach_backward_named(list,iterator,nb_elements,prev,next) \
114 for (nb_elements=0, (iterator) = list_get_tail_named(list,prev,next) ; \
115 (iterator) && (!nb_elements || \
116 ((iterator) != list_get_tail_named(list,prev,next))) ; \
117 nb_elements++, (iterator) = (iterator)->prev )
118
119 #define list_foreach_named list_foreach_forward_named
120
121
122 #define list_foreach_early_break(list,iterator,nb_elements) \
123 ((list) && ( \
124 ((list) != (iterator)) || \
125 ( ((list) == (iterator)) && (nb_elements == 0)) ))
126
127
128 #define list_collapse_named(list,iterator,prev,next) \
129 for ( ; ({ ((iterator) = (list)) ; \
130 if (list) list_delete_named(list,iterator,prev,next) ; \
131 (iterator); }) ; )
132
133
134
135
136
137
138
139 #define list_init(list) \
140 list_init_named(list,prev,next)
141
142 #define list_singleton(list,item) \
143 list_singleton_named(list,item,prev,next)
144
145 #define list_is_empty(list) \
146 list_is_empty_named(list,prev,next)
147
148 #define list_get_head(list) \
149 list_get_head_named(list,prev,next) \
150
151 #define list_get_tail(list) \
152 list_get_tail_named(list,prev,next) \
153
154
155 #define list_insert_after(list,after_this,item) \
156 list_insert_after_named(list,after_this,item,prev,next)
157
158
159 #define list_insert_before(list,before_this,item) \
160 list_insert_before_named(list,before_this,item,prev,next)
161
162 #define list_add_head(list,item) \
163 list_add_head_named(list,item,prev,next)
164
165 #define list_add_tail(list,item) \
166 list_add_tail_named(list,item,prev,next)
167
168
169 #define list_delete(list,item) \
170 list_delete_named(list,item,prev,next)
171
172 #define list_pop_head(list) \
173 list_pop_head_named(list,prev,next)
174
175 #define list_foreach_forward(list,iterator,nb_elements) \
176 list_foreach_forward_named(list,iterator,nb_elements,prev,next)
177
178 #define list_foreach_backward(list,iterator,nb_elements) \
179 list_foreach_backward_named(list,iterator,nb_elements,prev,next)
180
181 #define list_foreach list_foreach_forward
182
183 #define list_collapse(list,iterator) \
184 list_collapse_named(list,iterator,prev,next)
185
186 #endif