Remove GLib dependency.
[pwmd.git] / src / util-slist.c
blob8f4ba457df02f2376e3d2a1d7b208e2a895ea935
1 /*
2 Copyright (C) 2012
3 Ben Kibbey <bjk@luxsci.net>
5 This file is part of pwmd.
7 Pwmd is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 2 of the License, or
10 (at your option) any later version.
12 Pwmd is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Pwmd. If not, see <http://www.gnu.org/licenses/>.
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
24 #include <stdio.h>
25 #include "util-slist.h"
26 #include "mem.h"
28 unsigned slist_length(struct slist_s *list)
30 struct slist_s *cur;
31 unsigned n = 0;
33 for (cur = list; cur; cur = cur->next)
34 n++;
36 return n;
39 void *slist_nth_data(struct slist_s *list, unsigned n)
41 struct slist_s *cur;
42 unsigned i;
44 for (i = 0, cur = list; cur; cur = cur->next, i++) {
45 if (i == n)
46 return cur->data;
49 return NULL;
52 struct slist_s *slist_append(struct slist_s *list, void *data)
54 struct slist_s *cur;
56 if (!list) {
57 cur = xcalloc(1, sizeof(struct slist_s));
58 cur->data = data;
59 return cur;
62 for (cur = list; cur; cur = cur->next) {
63 if (!cur->next)
64 break;
67 cur->next = xcalloc(1, sizeof(struct slist_s));
68 cur->next->data = data;
69 return list;
72 static struct slist_s *free_once(struct slist_s *cur)
74 struct slist_s *next = cur ? cur->next : NULL;
76 xfree(cur);
77 return next;
80 void slist_free(struct slist_s *list)
82 while (list)
83 list = free_once(list);
86 struct slist_s *slist_remove(struct slist_s *list, void *data)
88 struct slist_s *prev, *cur;
90 for (cur = prev = list; cur; prev = cur, cur = cur->next) {
91 if (cur->data == data) {
92 struct slist_s *next = free_once(cur);
94 if (cur != list)
95 prev->next = next;
96 else
97 list = next;
98 break;
102 return list;