From fe37091ff0fd9e69d64a0ba72e5c21ddaf7d902f Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Wed, 6 Dec 2006 18:38:10 +0100 Subject: [PATCH] src/utils_llist.[ch]: Added a generic linked list implementation. --- src/Makefile.am | 1 + src/utils_llist.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++ src/utils_llist.h | 58 ++++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 src/utils_llist.c create mode 100644 src/utils_llist.h diff --git a/src/Makefile.am b/src/Makefile.am index fcbcb167..638deb7d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,6 +12,7 @@ sbin_PROGRAMS = collectd collectd_SOURCES = collectd.c collectd.h \ utils_debug.c utils_debug.h \ utils_mount.c utils_mount.h \ + utils_llist.c utils_llist.h \ utils_ignorelist.c utils_ignorelist.h \ common.c common.h \ network.c network.h \ diff --git a/src/utils_llist.c b/src/utils_llist.c new file mode 100644 index 00000000..2e04152f --- /dev/null +++ b/src/utils_llist.c @@ -0,0 +1,132 @@ +/** + * collectd - src/utils_llist.c + * Copyright (C) 2006 Florian Forster + * + * This program is free software; you can redistribute it and/ + * or modify it under the terms of the GNU General Public Li- + * cence as published by the Free Software Foundation; only + * version 2 of the Licence is applicable. + * + * This program is distributed in the hope that it will be use- + * ful, but WITHOUT ANY WARRANTY; without even the implied war- + * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public Licence for more details. + * + * You should have received a copy of the GNU General Public + * Licence along with this program; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, + * USA. + * + * Authors: + * Florian Forster + */ + +#include +#include + +#include "utils_llist.h" + +/* + * Private data types + */ +struct llist_s +{ + llentry_t *head; + llentry_t *tail; +}; + +/* + * Public functions + */ +llist_t *llist_create (void) +{ + llist_t *ret; + + ret = (llist_t *) malloc (sizeof (llist_t)); + if (ret == NULL) + return (NULL); + + memset (ret, '\0', sizeof (llist_t)); + + return (ret); +} + +void llist_destroy (llist_t *l) +{ + llentry_t *e_this; + llentry_t *e_next; + + for (e_this = l->head; e_this != NULL; e_this = e_next) + { + e_next = e_this->next; + llentry_destroy (e_this); + } + + free (l); +} + +llentry_t *llentry_create (const char *key, void *value) +{ + llentry_t *e; + + e = (llentry_t *) malloc (sizeof (llentry_t)); + if (e == NULL) + return (NULL); + + e->key = strdup (key); + e->value = value; + e->next = NULL; + + if (e->key == NULL) + { + free (e); + return (NULL); + } + + return (e); +} + +void llentry_destroy (llentry_t *e) +{ + free (e->key); + free (e); +} + +void llist_append (llist_t *l, llentry_t *e) +{ + e->next = NULL; + + if (l->tail == NULL) + l->head = e; + else + l->tail->next = e; + + l->tail = e; +} + +void llist_prepend (llist_t *l, llentry_t *e) +{ + e->next = l->head; + l->head = e; +} + +llentry_t *llist_search (llist_t *l, const char *key) +{ + llentry_t *e; + + for (e = l->head; e != NULL; e = e->next) + if (strcmp (key, e->key) == 0) + break; + + return (e); +} + +llentry_t *llist_head (llist_t *l) +{ + return (l->head); +} + +llentry_t *llist_tail (llist_t *l) +{ + return (l->tail); +} diff --git a/src/utils_llist.h b/src/utils_llist.h new file mode 100644 index 00000000..e44d84ef --- /dev/null +++ b/src/utils_llist.h @@ -0,0 +1,58 @@ +/** + * collectd - src/utils_llist.h + * Copyright (C) 2006 Florian Forster + * + * This program is free software; you can redistribute it and/ + * or modify it under the terms of the GNU General Public Li- + * cence as published by the Free Software Foundation; only + * version 2 of the Licence is applicable. + * + * This program is distributed in the hope that it will be use- + * ful, but WITHOUT ANY WARRANTY; without even the implied war- + * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public Licence for more details. + * + * You should have received a copy of the GNU General Public + * Licence along with this program; if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, + * USA. + * + * Authors: + * Florian Forster + */ + +#ifndef UTILS_LLIST_H +#define UTILS_LLIST_H 1 + +/* + * Data types + */ +struct llentry_s +{ + char *key; + void *value; + struct llentry_s *next; +}; +typedef struct llentry_s llentry_t; + +struct llist_s; +typedef struct llist_s llist_t; + +/* + * Functions + */ +llist_t *llist_create (void); +void llist_destroy (llist_t *l); + +llentry_t *llentry_create (const char *key, void *value); +void llentry_destroy (llentry_t *e); + +void llist_append (llist_t *l, llentry_t *e); +void llist_prepend (llist_t *l, llentry_t *e); + +llentry_t *llist_search (llist_t *l, const char *key); + +llentry_t *llist_head (llist_t *l); +llentry_t *llist_tail (llist_t *l); + +#endif /* UTILS_LLIST_H */ -- 2.30.2