jack1 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

305 lines
4.8KB

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