1 /**
2 * collectd - src/utils_llist.c
3 * Copyright (C) 2006 Florian Forster <octo at verplant.org>
4 *
5 * This program is free software; you can redistribute it and/
6 * or modify it under the terms of the GNU General Public Li-
7 * cence as published by the Free Software Foundation; only
8 * version 2 of the Licence is applicable.
9 *
10 * This program is distributed in the hope that it will be use-
11 * ful, but WITHOUT ANY WARRANTY; without even the implied war-
12 * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public Licence for more details.
14 *
15 * You should have received a copy of the GNU General Public
16 * Licence along with this program; if not, write to the Free
17 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
18 * USA.
19 *
20 * Authors:
21 * Florian Forster <octo at verplant.org>
22 */
24 #include <stdlib.h>
25 #include <string.h>
27 #include "utils_llist.h"
29 /*
30 * Private data types
31 */
32 struct llist_s
33 {
34 llentry_t *head;
35 llentry_t *tail;
36 };
38 /*
39 * Public functions
40 */
41 llist_t *llist_create (void)
42 {
43 llist_t *ret;
45 ret = (llist_t *) malloc (sizeof (llist_t));
46 if (ret == NULL)
47 return (NULL);
49 memset (ret, '\0', sizeof (llist_t));
51 return (ret);
52 }
54 void llist_destroy (llist_t *l)
55 {
56 llentry_t *e_this;
57 llentry_t *e_next;
59 for (e_this = l->head; e_this != NULL; e_this = e_next)
60 {
61 e_next = e_this->next;
62 llentry_destroy (e_this);
63 }
65 free (l);
66 }
68 llentry_t *llentry_create (const char *key, void *value)
69 {
70 llentry_t *e;
72 e = (llentry_t *) malloc (sizeof (llentry_t));
73 if (e == NULL)
74 return (NULL);
76 e->key = strdup (key);
77 e->value = value;
78 e->next = NULL;
80 if (e->key == NULL)
81 {
82 free (e);
83 return (NULL);
84 }
86 return (e);
87 }
89 void llentry_destroy (llentry_t *e)
90 {
91 free (e->key);
92 free (e);
93 }
95 void llist_append (llist_t *l, llentry_t *e)
96 {
97 e->next = NULL;
99 if (l->tail == NULL)
100 l->head = e;
101 else
102 l->tail->next = e;
104 l->tail = e;
105 }
107 void llist_prepend (llist_t *l, llentry_t *e)
108 {
109 e->next = l->head;
110 l->head = e;
111 }
113 void llist_remove (llist_t *l, llentry_t *e)
114 {
115 llentry_t *prev;
117 prev = l->head;
118 while ((prev != NULL) && (prev->next != e))
119 prev = prev->next;
121 if (prev != NULL)
122 prev->next = e->next;
123 if (l->head == e)
124 l->head = e->next;
125 if (l->tail == e)
126 l->tail = prev;
127 }
129 llentry_t *llist_search (llist_t *l, const char *key)
130 {
131 llentry_t *e;
133 for (e = l->head; e != NULL; e = e->next)
134 if (strcmp (key, e->key) == 0)
135 break;
137 return (e);
138 }
140 llentry_t *llist_head (llist_t *l)
141 {
142 return (l->head);
143 }
145 llentry_t *llist_tail (llist_t *l)
146 {
147 return (l->tail);
148 }