jack2 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.

575 lines
11KB

  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 memory 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. */
  19. #ifndef __jack_jslist_h__
  20. #define __jack_jslist_h__
  21. #include <stdlib.h>
  22. #ifdef WIN32
  23. #define __inline__ inline
  24. #endif
  25. typedef struct _JSList JSList;
  26. typedef int (*JCompareFunc) (void* a, void* b);
  27. struct _JSList
  28. {
  29. void *data;
  30. JSList *next;
  31. };
  32. static __inline__
  33. JSList*
  34. jack_slist_alloc (void)
  35. {
  36. JSList *new_list;
  37. new_list = (JSList*)malloc(sizeof(JSList));
  38. new_list->data = NULL;
  39. new_list->next = NULL;
  40. return new_list;
  41. }
  42. static __inline__
  43. JSList*
  44. jack_slist_prepend (JSList* list, void* data)
  45. {
  46. JSList *new_list;
  47. new_list = (JSList*)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. while (list->next)
  59. list = list->next;
  60. }
  61. return list;
  62. }
  63. static __inline__
  64. JSList*
  65. jack_slist_remove_link (JSList *list,
  66. JSList *link)
  67. {
  68. JSList *tmp;
  69. JSList *prev;
  70. prev = NULL;
  71. tmp = list;
  72. while (tmp) {
  73. if (tmp == link) {
  74. if (prev)
  75. prev->next = tmp->next;
  76. if (list == tmp)
  77. list = list->next;
  78. tmp->next = NULL;
  79. break;
  80. }
  81. prev = tmp;
  82. tmp = tmp->next;
  83. }
  84. return list;
  85. }
  86. static __inline__
  87. void
  88. jack_slist_free (JSList *list)
  89. {
  90. while (list) {
  91. JSList *next = list->next;
  92. free(list);
  93. list = next;
  94. }
  95. }
  96. static __inline__
  97. void
  98. jack_slist_free_1 (JSList *list)
  99. {
  100. if (list) {
  101. free(list);
  102. }
  103. }
  104. static __inline__
  105. JSList*
  106. jack_slist_remove (JSList *list,
  107. void *data)
  108. {
  109. JSList *tmp;
  110. JSList *prev;
  111. prev = NULL;
  112. tmp = list;
  113. while (tmp) {
  114. if (tmp->data == data) {
  115. if (prev)
  116. prev->next = tmp->next;
  117. if (list == tmp)
  118. list = list->next;
  119. tmp->next = NULL;
  120. jack_slist_free (tmp);
  121. break;
  122. }
  123. prev = tmp;
  124. tmp = tmp->next;
  125. }
  126. return list;
  127. }
  128. static __inline__
  129. unsigned int
  130. jack_slist_length (JSList *list)
  131. {
  132. unsigned int length;
  133. length = 0;
  134. while (list) {
  135. length++;
  136. list = list->next;
  137. }
  138. return length;
  139. }
  140. static __inline__
  141. JSList*
  142. jack_slist_find (JSList *list,
  143. void *data)
  144. {
  145. while (list) {
  146. if (list->data == data)
  147. break;
  148. list = list->next;
  149. }
  150. return list;
  151. }
  152. static __inline__
  153. JSList*
  154. jack_slist_copy (JSList *list)
  155. {
  156. JSList *new_list = NULL;
  157. if (list) {
  158. JSList *last;
  159. new_list = jack_slist_alloc ();
  160. new_list->data = list->data;
  161. last = new_list;
  162. list = list->next;
  163. while (list) {
  164. last->next = jack_slist_alloc ();
  165. last = last->next;
  166. last->data = list->data;
  167. list = list->next;
  168. }
  169. }
  170. return new_list;
  171. }
  172. static __inline__
  173. JSList*
  174. jack_slist_append (JSList *list,
  175. void *data)
  176. {
  177. JSList *new_list;
  178. JSList *last;
  179. new_list = jack_slist_alloc ();
  180. new_list->data = data;
  181. if (list) {
  182. last = jack_slist_last (list);
  183. last->next = new_list;
  184. return list;
  185. } else
  186. return new_list;
  187. }
  188. static __inline__
  189. JSList*
  190. jack_slist_sort_merge (JSList *l1,
  191. JSList *l2,
  192. JCompareFunc compare_func)
  193. {
  194. JSList list, *l;
  195. l = &list;
  196. while (l1 && l2) {
  197. if (compare_func(l1->data, l2->data) < 0) {
  198. l = l->next = l1;
  199. l1 = l1->next;
  200. } else {
  201. l = l->next = l2;
  202. l2 = l2->next;
  203. }
  204. }
  205. l->next = l1 ? l1 : l2;
  206. return list.next;
  207. }
  208. static __inline__
  209. JSList*
  210. jack_slist_sort (JSList *list,
  211. JCompareFunc compare_func)
  212. {
  213. JSList *l1, *l2;
  214. if (!list)
  215. return NULL;
  216. if (!list->next)
  217. return list;
  218. l1 = list;
  219. l2 = list->next;
  220. while ((l2 = l2->next) != NULL) {
  221. if ((l2 = l2->next) == NULL)
  222. break;
  223. l1 = l1->next;
  224. }
  225. l2 = l1->next;
  226. l1->next = NULL;
  227. return jack_slist_sort_merge (jack_slist_sort (list, compare_func),
  228. jack_slist_sort (l2, compare_func),
  229. compare_func);
  230. }
  231. #endif /* __jack_jslist_h__ */
  232. /*
  233. Based on gslist.c from glib-1.2.9 (LGPL).
  234. Adaption to JACK, Copyright (C) 2002 Kai Vehmanen.
  235. - replaced use of gtypes with normal ANSI C types
  236. - glib's memory allocation routines replaced with
  237. malloc/free calls
  238. This program is free software; you can redistribute it and/or modify
  239. it under the terms of the GNU Lesser General Public License as published by
  240. the Free Software Foundation; either version 2.1 of the License, or
  241. (at your option) any later version.
  242. This program is distributed in the hope that it will be useful,
  243. but WITHOUT ANY WARRANTY; without even the implied warranty of
  244. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  245. GNU Lesser General Public License for more details.
  246. You should have received a copy of the GNU Lesser General Public License
  247. along with this program; if not, write to the Free Software
  248. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  249. */
  250. #ifndef __jack_jslist_h__
  251. #define __jack_jslist_h__
  252. #include <stdlib.h>
  253. #ifdef WIN32
  254. #define __inline__ inline
  255. #endif
  256. typedef struct _JSList JSList;
  257. typedef int (*JCompareFunc) (void* a, void* b);
  258. struct _JSList
  259. {
  260. void *data;
  261. JSList *next;
  262. };
  263. static __inline__
  264. JSList*
  265. jack_slist_alloc (void)
  266. {
  267. JSList *new_list;
  268. new_list = (JSList*)malloc(sizeof(JSList));
  269. new_list->data = NULL;
  270. new_list->next = NULL;
  271. return new_list;
  272. }
  273. static __inline__
  274. JSList*
  275. jack_slist_prepend (JSList* list, void* data)
  276. {
  277. JSList *new_list;
  278. new_list = (JSList*)malloc(sizeof(JSList));
  279. new_list->data = data;
  280. new_list->next = list;
  281. return new_list;
  282. }
  283. #define jack_slist_next(slist) ((slist) ? (((JSList *)(slist))->next) : NULL)
  284. static __inline__
  285. JSList*
  286. jack_slist_last (JSList *list)
  287. {
  288. if (list) {
  289. while (list->next)
  290. list = list->next;
  291. }
  292. return list;
  293. }
  294. static __inline__
  295. JSList*
  296. jack_slist_remove_link (JSList *list,
  297. JSList *link)
  298. {
  299. JSList *tmp;
  300. JSList *prev;
  301. prev = NULL;
  302. tmp = list;
  303. while (tmp) {
  304. if (tmp == link) {
  305. if (prev)
  306. prev->next = tmp->next;
  307. if (list == tmp)
  308. list = list->next;
  309. tmp->next = NULL;
  310. break;
  311. }
  312. prev = tmp;
  313. tmp = tmp->next;
  314. }
  315. return list;
  316. }
  317. static __inline__
  318. void
  319. jack_slist_free (JSList *list)
  320. {
  321. while (list) {
  322. JSList *next = list->next;
  323. free(list);
  324. list = next;
  325. }
  326. }
  327. static __inline__
  328. void
  329. jack_slist_free_1 (JSList *list)
  330. {
  331. if (list) {
  332. free(list);
  333. }
  334. }
  335. static __inline__
  336. JSList*
  337. jack_slist_remove (JSList *list,
  338. void *data)
  339. {
  340. JSList *tmp;
  341. JSList *prev;
  342. prev = NULL;
  343. tmp = list;
  344. while (tmp) {
  345. if (tmp->data == data) {
  346. if (prev)
  347. prev->next = tmp->next;
  348. if (list == tmp)
  349. list = list->next;
  350. tmp->next = NULL;
  351. jack_slist_free (tmp);
  352. break;
  353. }
  354. prev = tmp;
  355. tmp = tmp->next;
  356. }
  357. return list;
  358. }
  359. static __inline__
  360. unsigned int
  361. jack_slist_length (JSList *list)
  362. {
  363. unsigned int length;
  364. length = 0;
  365. while (list) {
  366. length++;
  367. list = list->next;
  368. }
  369. return length;
  370. }
  371. static __inline__
  372. JSList*
  373. jack_slist_find (JSList *list,
  374. void *data)
  375. {
  376. while (list) {
  377. if (list->data == data)
  378. break;
  379. list = list->next;
  380. }
  381. return list;
  382. }
  383. static __inline__
  384. JSList*
  385. jack_slist_copy (JSList *list)
  386. {
  387. JSList *new_list = NULL;
  388. if (list) {
  389. JSList *last;
  390. new_list = jack_slist_alloc ();
  391. new_list->data = list->data;
  392. last = new_list;
  393. list = list->next;
  394. while (list) {
  395. last->next = jack_slist_alloc ();
  396. last = last->next;
  397. last->data = list->data;
  398. list = list->next;
  399. }
  400. }
  401. return new_list;
  402. }
  403. static __inline__
  404. JSList*
  405. jack_slist_append (JSList *list,
  406. void *data)
  407. {
  408. JSList *new_list;
  409. JSList *last;
  410. new_list = jack_slist_alloc ();
  411. new_list->data = data;
  412. if (list) {
  413. last = jack_slist_last (list);
  414. last->next = new_list;
  415. return list;
  416. } else
  417. return new_list;
  418. }
  419. static __inline__
  420. JSList*
  421. jack_slist_sort_merge (JSList *l1,
  422. JSList *l2,
  423. JCompareFunc compare_func)
  424. {
  425. JSList list, *l;
  426. l = &list;
  427. while (l1 && l2) {
  428. if (compare_func(l1->data, l2->data) < 0) {
  429. l = l->next = l1;
  430. l1 = l1->next;
  431. } else {
  432. l = l->next = l2;
  433. l2 = l2->next;
  434. }
  435. }
  436. l->next = l1 ? l1 : l2;
  437. return list.next;
  438. }
  439. static __inline__
  440. JSList*
  441. jack_slist_sort (JSList *list,
  442. JCompareFunc compare_func)
  443. {
  444. JSList *l1, *l2;
  445. if (!list)
  446. return NULL;
  447. if (!list->next)
  448. return list;
  449. l1 = list;
  450. l2 = list->next;
  451. while ((l2 = l2->next) != NULL) {
  452. if ((l2 = l2->next) == NULL)
  453. break;
  454. l1 = l1->next;
  455. }
  456. l2 = l1->next;
  457. l1->next = NULL;
  458. return jack_slist_sort_merge (jack_slist_sort (list, compare_func),
  459. jack_slist_sort (l2, compare_func),
  460. compare_func);
  461. }
  462. #endif /* __jack_jslist_h__ */