2 * FreeRDP: A Remote Desktop Protocol Client
3 * Double-linked List Utils
5 * Copyright 2011 Vic Lee
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
23 #include <freerdp/utils/memory.h>
24 #include <freerdp/utils/list.h>
26 static LIST_ITEM* list_item_new(void* data)
30 item = xnew(LIST_ITEM);
35 static LIST_ITEM* list_item_find(LIST* list, void* data)
39 for (item = list->head; item; item = item->next)
41 if (item->data == data)
56 void list_free(LIST* list)
63 void list_enqueue(LIST* list, void* data)
67 item = list_item_new(data);
68 if (list->tail == NULL)
75 item->prev = list->tail;
76 list->tail->next = item;
82 void* list_dequeue(LIST* list)
90 list->head = item->next;
91 if (list->head == NULL)
94 list->head->prev = NULL;
103 void* list_peek(LIST* list)
108 return item ? item->data : NULL;
111 void* list_next(LIST* list, void* data)
115 item = list_item_find(list, data);
119 if (item->next != NULL)
120 data = item->next->data;
125 void* list_remove(LIST* list, void* data)
129 item = list_item_find(list, data);
132 if (item->prev != NULL)
133 item->prev->next = item->next;
134 if (item->next != NULL)
135 item->next->prev = item->prev;
136 if (list->head == item)
137 list->head = item->next;
138 if (list->tail == item)
139 list->tail = item->prev;
148 int list_size(LIST* list)