OpenOCD
list.c
Go to the documentation of this file.
1 /*
2  * This file is part of the libjaylink project.
3  *
4  * Copyright (C) 2014-2016 Marc Schink <jaylink-dev@marcschink.de>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <stdlib.h>
21 
22 #include "libjaylink-internal.h"
23 
31 JAYLINK_PRIV struct list *list_prepend(struct list *list, void *data)
32 {
33  struct list *item;
34 
35  item = malloc(sizeof(struct list));
36 
37  if (!item)
38  return NULL;
39 
40  item->data = data;
41  item->next = list;
42 
43  return item;
44 }
45 
47 JAYLINK_PRIV struct list *list_remove(struct list *list, const void *data)
48 {
49  struct list *item;
50  struct list *tmp;
51 
52  if (!list)
53  return NULL;
54 
55  item = list;
56 
57  if (item->data == data) {
58  tmp = item->next;
59  free(item);
60  return tmp;
61  }
62 
63  while (item->next) {
64  if (item->next->data == data) {
65  tmp = item->next;
66  item->next = item->next->next;
67  free(tmp);
68  break;
69  }
70 
71  item = item->next;
72  }
73 
74  return list;
75 }
76 
79  list_compare_callback callback, const void *user_data)
80 {
81  if (!callback)
82  return NULL;
83 
84  while (list) {
85  if (callback(list->data, user_data))
86  return list;
87 
88  list = list->next;
89  }
90 
91  return NULL;
92 }
93 
96 {
97  size_t length;
98 
99  for (length = 0; list; length++)
100  list = list->next;
101 
102  return length;
103 }
104 
107 {
108  struct list *tmp;
109 
110  while (list) {
111  tmp = list;
112  list = list->next;
113  free(tmp);
114  }
115 }
#define NULL
Definition: usb.h:27
struct list * next