initial revision
[ucgine.git] / tools / cfzy / libconfizery / cfzy_list.c
1 /*
2  * Copyright (c) 2013, Olivier MATZ <zer0@droids-corp.org>
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     * Neither the name of the University of California, Berkeley nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include <stdlib.h>
29
30 #include "cfzy_list.h"
31
32 /* allocate a list_elt and insert at the tail of the list */
33 int cfzy_list_add_tail(struct cfzy_list_head *list, void *ptr)
34 {
35         struct cfzy_list_elt *e;
36
37         e = malloc(sizeof(struct cfzy_list_elt));
38         if (e == NULL)
39                 return -1;
40
41         e->ptr = ptr;
42         TAILQ_INSERT_TAIL(list, e, next);
43         return 0;
44 }
45
46 /* allocate a list_elt and insert at the tail of the list */
47 int cfzy_list_add_head(struct cfzy_list_head *list, void *ptr)
48 {
49         struct cfzy_list_elt *e;
50
51         e = malloc(sizeof(struct cfzy_list_elt));
52         if (e == NULL)
53                 return -1;
54
55         e->ptr = ptr;
56         TAILQ_INSERT_HEAD(list, e, next);
57         return 0;
58 }
59
60 /* remove from the list and free the list_elt */
61 void cfzy_list_del(struct cfzy_list_head *list, struct cfzy_list_elt *e)
62 {
63         TAILQ_REMOVE(list, e, next);
64         free(e);
65 }
66
67 /* check if an elt is in list */
68 int cfzy_list_elt_is_in_list(const struct cfzy_list_head *list, const void *ptr)
69 {
70         struct cfzy_list_elt *e;
71
72         TAILQ_FOREACH(e, list, next) {
73                 if (e->ptr == ptr)
74                         return 1;
75         }
76         return 0;
77 }
78
79 /* allocate a new list_head */
80 struct cfzy_list_head *cfzy_list_alloc(void)
81 {
82         struct cfzy_list_head *list;
83
84         list = malloc(sizeof(struct cfzy_list_head));
85         if (list == NULL)
86                 return NULL;
87
88         TAILQ_INIT(list);
89         return list;
90 }
91
92 /* empty the list, freeing the list_elt, and free the list_head */
93 void cfzy_list_free(struct cfzy_list_head *list, void (*free_fct)(void *))
94 {
95         struct cfzy_list_elt *e;
96
97         while ((e = TAILQ_FIRST(list)) != NULL) {
98                 TAILQ_REMOVE(list, e, next);
99                 if (free_fct != NULL)
100                         free_fct(e->ptr);
101                 free(e);
102         }
103         free(list);
104 }