From 148aa53876853a637e5b94f3c6aae5fb2d788c90 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Thu, 9 Mar 2006 17:57:03 +0000 Subject: Generic singly linked list functionality --- common/Makefile.am | 4 ++- common/list.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/list.h | 38 ++++++++++++++++++++++ 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 common/list.c create mode 100644 common/list.h (limited to 'common') diff --git a/common/Makefile.am b/common/Makefile.am index 5a5a4702..d2233f94 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -1,5 +1,7 @@ -noinst_LIBRARIES = libtextfile.a libglib-ectomy.a +noinst_LIBRARIES = libtextfile.a libglib-ectomy.a liblist.a + +liblist_a_SOURCES = list.h list.c libtextfile_a_SOURCES = textfile.h textfile.c diff --git a/common/list.c b/common/list.c new file mode 100644 index 00000000..cb160501 --- /dev/null +++ b/common/list.c @@ -0,0 +1,94 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2006 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "list.h" + +struct slist *slist_append(struct slist *list, void *data) +{ + struct slist *entry, *tail; + + entry = malloc(sizeof(struct slist)); + /* FIXME: this currently just silently fails */ + if (!entry) + return list; + + entry->data = data; + entry->next = NULL; + + if (!list) + return entry; + + /* Find the end of the list */ + for (tail = list; tail->next; tail = tail->next); + + tail->next = entry; + + return list; +} + +struct slist *slist_remove(struct slist *list, void *data) +{ + struct slist *l, *next, *prev = NULL, *match = NULL; + + if (!list) + return NULL; + + for (l = list; l != NULL; l = l->next) { + if (l->data == data) { + match = l; + break; + } + prev = l; + } + + if (!match) + return list; + + next = match->next; + match->next = NULL; + + /* If the head was removed, return the next element */ + if (!prev) + return next; + + prev->next = match->next; + + return list; +} + +void slist_free(struct slist *list) +{ + struct slist *l, *next; + + for (l = list; l != NULL; l = next) { + next = l->next; + free(l); + } +} diff --git a/common/list.h b/common/list.h new file mode 100644 index 00000000..9185796e --- /dev/null +++ b/common/list.h @@ -0,0 +1,38 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2006 Marcel Holtmann + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#ifndef _LIST_H_ +#define _LIST_H_ + +struct slist { + void *data; + struct slist *next; +}; + +struct slist *slist_append(struct slist *list, void *data); + +struct slist *slist_remove(struct slist *list, void *data); + +void slist_free(struct slist *list); + + +#endif /* _LIST_H_ */ -- cgit