|
- /*
- Based on gslist.c from glib-1.2.9 (LGPL).
-
- Adaption to JACK, Copyright (C) 2002 Kai Vehmanen.
- - replaced use of gtypes with normal ANSI C types
- - glib's memory allocation routines replaced with
- malloc/free calls
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
-
- #ifndef __jack_jslist_h__
- #define __jack_jslist_h__
-
- #include <stdlib.h>
- #include <jack/systemdeps.h>
-
- #ifdef sun
- #define __inline__
- #endif
-
- typedef struct _JSList JSList;
-
- typedef int (*JCompareFunc) (void* a, void* b);
- struct _JSList
- {
- void *data;
- JSList *next;
- };
-
- static __inline__
- JSList*
- jack_slist_alloc (void)
- {
- JSList *new_list;
-
- new_list = (JSList*)malloc(sizeof(JSList));
- if (new_list) {
- new_list->data = NULL;
- new_list->next = NULL;
- }
-
- return new_list;
- }
-
- static __inline__
- JSList*
- jack_slist_prepend (JSList* list, void* data)
- {
- JSList *new_list;
-
- new_list = (JSList*)malloc(sizeof(JSList));
- if (new_list) {
- new_list->data = data;
- new_list->next = list;
- }
-
- return new_list;
- }
-
- #define jack_slist_next(slist) ((slist) ? (((JSList *)(slist))->next) : NULL)
- static __inline__
- JSList*
- jack_slist_last (JSList *list)
- {
- if (list) {
- while (list->next)
- list = list->next;
- }
-
- return list;
- }
-
- static __inline__
- JSList*
- jack_slist_remove_link (JSList *list,
- JSList *link)
- {
- JSList *tmp;
- JSList *prev;
-
- prev = NULL;
- tmp = list;
-
- while (tmp) {
- if (tmp == link) {
- if (prev)
- prev->next = tmp->next;
- if (list == tmp)
- list = list->next;
-
- tmp->next = NULL;
- break;
- }
-
- prev = tmp;
- tmp = tmp->next;
- }
-
- return list;
- }
-
- static __inline__
- void
- jack_slist_free (JSList *list)
- {
- while (list) {
- JSList *next = list->next;
- free(list);
- list = next;
- }
- }
-
- static __inline__
- void
- jack_slist_free_1 (JSList *list)
- {
- if (list) {
- free(list);
- }
- }
-
- static __inline__
- JSList*
- jack_slist_remove (JSList *list,
- void *data)
- {
- JSList *tmp;
- JSList *prev;
-
- prev = NULL;
- tmp = list;
-
- while (tmp) {
- if (tmp->data == data) {
- if (prev)
- prev->next = tmp->next;
- if (list == tmp)
- list = list->next;
-
- tmp->next = NULL;
- jack_slist_free (tmp);
-
- break;
- }
-
- prev = tmp;
- tmp = tmp->next;
- }
-
- return list;
- }
-
- static __inline__
- unsigned int
- jack_slist_length (JSList *list)
- {
- unsigned int length;
-
- length = 0;
- while (list) {
- length++;
- list = list->next;
- }
-
- return length;
- }
-
- static __inline__
- JSList*
- jack_slist_find (JSList *list,
- void *data)
- {
- while (list) {
- if (list->data == data)
- break;
- list = list->next;
- }
-
- return list;
- }
-
- static __inline__
- JSList*
- jack_slist_copy (JSList *list)
- {
- JSList *new_list = NULL;
-
- if (list) {
- JSList *last;
-
- new_list = jack_slist_alloc ();
- new_list->data = list->data;
- last = new_list;
- list = list->next;
- while (list) {
- last->next = jack_slist_alloc ();
- last = last->next;
- last->data = list->data;
- list = list->next;
- }
- }
-
- return new_list;
- }
-
- static __inline__
- JSList*
- jack_slist_append (JSList *list,
- void *data)
- {
- JSList *new_list;
- JSList *last;
-
- new_list = jack_slist_alloc ();
- new_list->data = data;
-
- if (list) {
- last = jack_slist_last (list);
- last->next = new_list;
-
- return list;
- } else
- return new_list;
- }
-
- static __inline__
- JSList*
- jack_slist_sort_merge (JSList *l1,
- JSList *l2,
- JCompareFunc compare_func)
- {
- JSList list, *l;
-
- l = &list;
-
- while (l1 && l2) {
- if (compare_func(l1->data, l2->data) < 0) {
- l = l->next = l1;
- l1 = l1->next;
- } else {
- l = l->next = l2;
- l2 = l2->next;
- }
- }
- l->next = l1 ? l1 : l2;
-
- return list.next;
- }
-
- static __inline__
- JSList*
- jack_slist_sort (JSList *list,
- JCompareFunc compare_func)
- {
- JSList *l1, *l2;
-
- if (!list)
- return NULL;
- if (!list->next)
- return list;
-
- l1 = list;
- l2 = list->next;
-
- while ((l2 = l2->next) != NULL) {
- if ((l2 = l2->next) == NULL)
- break;
- l1 = l1->next;
- }
- l2 = l1->next;
- l1->next = NULL;
-
- return jack_slist_sort_merge (jack_slist_sort (list, compare_func),
- jack_slist_sort (l2, compare_func),
- compare_func);
- }
-
- #endif /* __jack_jslist_h__ */
|