Add jaylink_device_get_usb_bus_ports()
[libjaylink.git] / libjaylink / list.c
blob7c54e50ecd30f4139a65075e601a16019ef8f6bd
1 /*
2 * This file is part of the libjaylink project.
4 * Copyright (C) 2014-2016 Marc Schink <jaylink-dev@marcschink.de>
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.
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.
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/>.
20 #include <stdlib.h>
22 #include "libjaylink-internal.h"
24 /**
25 * @file
27 * Singly-linked list functions.
30 /** @private */
31 JAYLINK_PRIV struct list *list_prepend(struct list *list, void *data)
33 struct list *item;
35 item = malloc(sizeof(struct list));
37 if (!item)
38 return NULL;
40 item->data = data;
41 item->next = list;
43 return item;
46 /** @private */
47 JAYLINK_PRIV struct list *list_remove(struct list *list, const void *data)
49 struct list *item;
50 struct list *tmp;
52 if (!list)
53 return NULL;
55 item = list;
57 if (item->data == data) {
58 tmp = item->next;
59 free(item);
60 return tmp;
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;
71 item = item->next;
74 return list;
77 /** @private */
78 JAYLINK_PRIV struct list *list_find_custom(struct list *list,
79 list_compare_callback callback, const void *user_data)
81 if (!callback)
82 return NULL;
84 while (list) {
85 if (callback(list->data, user_data))
86 return list;
88 list = list->next;
91 return NULL;
94 /** @private */
95 JAYLINK_PRIV size_t list_length(struct list *list)
97 size_t length;
99 for (length = 0; list; length++)
100 list = list->next;
102 return length;
105 /** @private */
106 JAYLINK_PRIV void list_free(struct list *list)
108 struct list *tmp;
110 while (list) {
111 tmp = list;
112 list = list->next;
113 free(tmp);