Potential overwriting of the original error code.
[pwmd.git] / src / util-slist.c
blob375867145e7feb663f87a900c5e21f9a9937d7a9
1 /*
2 Copyright (C) 2012, 2013
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
29 slist_length (struct slist_s *list)
31 struct slist_s *cur;
32 unsigned n = 0;
34 for (cur = list; cur; cur = cur->next)
35 n++;
37 return n;
40 void *
41 slist_nth_data (struct slist_s *list, unsigned n)
43 struct slist_s *cur;
44 unsigned i;
46 for (i = 0, cur = list; cur; cur = cur->next, i++)
48 if (i == n)
49 return cur->data;
52 return NULL;
55 struct slist_s *
56 slist_append (struct slist_s *list, void *data)
58 struct slist_s *cur;
60 if (!list)
62 cur = xcalloc (1, sizeof (struct slist_s));
63 cur->data = data;
64 return cur;
67 for (cur = list; cur; cur = cur->next)
69 if (!cur->next)
70 break;
73 cur->next = xcalloc (1, sizeof (struct slist_s));
74 cur->next->data = data;
75 return list;
78 static struct slist_s *
79 free_once (struct slist_s *cur)
81 struct slist_s *next = cur ? cur->next : NULL;
83 xfree (cur);
84 return next;
87 void
88 slist_free (struct slist_s *list)
90 while (list)
91 list = free_once (list);
94 struct slist_s *
95 slist_remove (struct slist_s *list, void *data)
97 struct slist_s *prev, *cur;
99 for (cur = prev = list; cur; prev = cur, cur = cur->next)
101 if (cur->data == data)
103 struct slist_s *next = free_once (cur);
105 if (cur != list)
106 prev->next = next;
107 else
108 list = next;
109 break;
113 return list;