Jack2  1.9.9
linux/alsa/jslist.h
1 /*
2  Based on gslist.c from glib-1.2.9 (LGPL).
3 
4  Adaption to JACK, Copyright (C) 2002 Kai Vehmanen.
5  - replaced use of gtypes with normal ANSI C types
6  - glib's memery allocation routines replaced with
7  malloc/free calls
8 
9  This program is free software; you can redistribute it and/or modify
10  it under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation; either version 2.1 of the License, or
12  (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 
23  $Id: jslist.h,v 1.2 2005/11/23 11:24:29 letz Exp $
24 */
25 
26 #ifndef __jack_jslist_h__
27 #define __jack_jslist_h__
28 
29 #include <stdlib.h>
30 
31 typedef struct _JSList JSList;
32 
33 typedef int (*JCompareFunc) (void* a,
34  void* b);
35 struct _JSList
36 {
37  void *data;
38  JSList *next;
39 };
40 
41 static __inline__
42 JSList*
43 jack_slist_alloc (void)
44 {
45  JSList *new_list;
46 
47  new_list = (JSList*)malloc(sizeof(JSList));
48  new_list->data = NULL;
49  new_list->next = NULL;
50 
51  return new_list;
52 }
53 
54 static __inline__
55 JSList*
56 jack_slist_prepend (JSList *list,
57  void *data)
58 {
59  JSList *new_list;
60 
61  new_list = (JSList*)malloc(sizeof(JSList));
62  new_list->data = data;
63  new_list->next = list;
64 
65  return new_list;
66 }
67 
68 #define jack_slist_next(slist) ((slist) ? (((JSList *)(slist))->next) : NULL)
69 static __inline__
70 JSList*
71 jack_slist_last (JSList *list)
72 {
73  if (list) {
74  while (list->next)
75  list = list->next;
76  }
77 
78  return list;
79 }
80 
81 static __inline__
82 JSList*
83 jack_slist_remove_link (JSList *list,
84  JSList *link)
85 {
86  JSList *tmp;
87  JSList *prev;
88 
89  prev = NULL;
90  tmp = list;
91 
92  while (tmp) {
93  if (tmp == link) {
94  if (prev)
95  prev->next = tmp->next;
96  if (list == tmp)
97  list = list->next;
98 
99  tmp->next = NULL;
100  break;
101  }
102 
103  prev = tmp;
104  tmp = tmp->next;
105  }
106 
107  return list;
108 }
109 
110 static __inline__
111 void
112 jack_slist_free (JSList *list)
113 {
114  while (list) {
115  JSList *next = list->next;
116  free(list);
117  list = next;
118  }
119 }
120 
121 static __inline__
122 void
123 jack_slist_free_1 (JSList *list)
124 {
125  if (list) {
126  free(list);
127  }
128 }
129 
130 static __inline__
131 JSList*
132 jack_slist_remove (JSList *list,
133  void *data)
134 {
135  JSList *tmp;
136  JSList *prev;
137 
138  prev = NULL;
139  tmp = list;
140 
141  while (tmp) {
142  if (tmp->data == data) {
143  if (prev)
144  prev->next = tmp->next;
145  if (list == tmp)
146  list = list->next;
147 
148  tmp->next = NULL;
149  jack_slist_free (tmp);
150 
151  break;
152  }
153 
154  prev = tmp;
155  tmp = tmp->next;
156  }
157 
158  return list;
159 }
160 
161 static __inline__
162 unsigned int
163 jack_slist_length (JSList *list)
164 {
165  unsigned int length;
166 
167  length = 0;
168  while (list) {
169  length++;
170  list = list->next;
171  }
172 
173  return length;
174 }
175 
176 static __inline__
177 JSList*
178 jack_slist_find (JSList *list,
179  void *data)
180 {
181  while (list) {
182  if (list->data == data)
183  break;
184  list = list->next;
185  }
186 
187  return list;
188 }
189 
190 static __inline__
191 JSList*
192 jack_slist_copy (JSList *list)
193 {
194  JSList *new_list = NULL;
195 
196  if (list) {
197  JSList *last;
198 
199  new_list = jack_slist_alloc ();
200  new_list->data = list->data;
201  last = new_list;
202  list = list->next;
203  while (list) {
204  last->next = jack_slist_alloc ();
205  last = last->next;
206  last->data = list->data;
207  list = list->next;
208  }
209  }
210 
211  return new_list;
212 }
213 
214 static __inline__
215 JSList*
216 jack_slist_append (JSList *list,
217  void *data)
218 {
219  JSList *new_list;
220  JSList *last;
221 
222  new_list = jack_slist_alloc ();
223  new_list->data = data;
224 
225  if (list) {
226  last = jack_slist_last (list);
227  last->next = new_list;
228 
229  return list;
230  } else
231  return new_list;
232 }
233 
234 static __inline__
235 JSList*
236 jack_slist_sort_merge (JSList *l1,
237  JSList *l2,
238  JCompareFunc compare_func)
239 {
240  JSList list, *l;
241 
242  l = &list;
243 
244  while (l1 && l2) {
245  if (compare_func(l1->data, l2->data) < 0) {
246  l = l->next = l1;
247  l1 = l1->next;
248  } else {
249  l = l->next = l2;
250  l2 = l2->next;
251  }
252  }
253  l->next = l1 ? l1 : l2;
254 
255  return list.next;
256 }
257 
258 static __inline__
259 JSList*
260 jack_slist_sort (JSList *list,
261  JCompareFunc compare_func)
262 {
263  JSList *l1, *l2;
264 
265  if (!list)
266  return NULL;
267  if (!list->next)
268  return list;
269 
270  l1 = list;
271  l2 = list->next;
272 
273  while ((l2 = l2->next) != NULL) {
274  if ((l2 = l2->next) == NULL)
275  break;
276  l1 = l1->next;
277  }
278  l2 = l1->next;
279  l1->next = NULL;
280 
281  return jack_slist_sort_merge (jack_slist_sort (list, compare_func),
282  jack_slist_sort (l2, compare_func),
283  compare_func);
284 }
285 
286 #endif /* __jack_jslist_h__ */