13597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu/* 22f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * list.c, list 330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * 42f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Copyright (c) 2009-2010 Wind River Systems, Inc. 52f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 62f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Licensed under the Apache License, Version 2.0 (the "License"); 72f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * you may not use this file except in compliance with the License. 82f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * You may obtain a copy of the License at 92f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 102f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * http://www.apache.org/licenses/LICENSE-2.0 112f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 122f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Unless required by applicable law or agreed to in writing, software 132f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * distributed under the License is distributed on an "AS IS" BASIS, 142f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 152f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * See the License for the specific language governing permissions and 162f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * limitations under the License. 173597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu */ 183597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 193597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#include <stdlib.h> 203597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 213597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu#include <list.h> 223597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 233597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuvoid __list_init(struct list *entry) 243597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 253597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (entry) { 263597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu entry->prev = NULL; 273597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu entry->next = NULL; 283597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu entry->data = NULL; 293597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 303597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 313597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 323597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_alloc(void) 333597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 343597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *new; 353597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 363597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new = malloc(sizeof(struct list)); 373597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu __list_init(new); 383597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 393597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return new; 403597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 413597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 423597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_alloc(void *data) 433597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 443597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *new; 453597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 463597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new = __list_alloc(); 473597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (new) 483597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new->data = data; 493597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 503597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return new; 513597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 523597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 533597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuvoid __list_free(struct list *entry) 543597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 553597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu free(entry); 563597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 573597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 583597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuvoid list_free_all(struct list *list) 593597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 603597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *ptr, *tmp; 613597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 623597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list_foreach_safe(list, ptr, tmp) { 633597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu __list_free(ptr); 643597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 653597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 663597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 673597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_last(struct list *list) 683597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 693597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (list) 703597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu while (list->next) 713597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list = list->next; 723597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 733597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return list; 743597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 753597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 763597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_first(struct list *list) 773597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 783597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (list) 793597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu while (list->prev) 803597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list = list->prev; 813597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 823597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return list; 833597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 843597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 853597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_entry(struct list *list, int index) 863597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 873597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *entry; 883597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu int i = 0; 893597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 903597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list_foreach(list, entry) { 913597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (i == index) 923597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu break; 933597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu i++; 943597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 953597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 963597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return entry; 973597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 983597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 993597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryuint list_length(struct list *list) 1003597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1013597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu int length = 0; 1023597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1033597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu while (list) { 1043597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list = list->next; 1053597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu length++; 1063597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 1073597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1083597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return length; 1093597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 1103597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1113597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_before(struct list *entry, struct list *new) 1123597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1133597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *prev; 1143597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1153597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (entry) { 1163597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu prev = entry->prev; 1173597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (prev) 1183597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu prev->next = new; 1193597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new->prev = prev; 1203597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new->next = entry; 1213597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu entry->prev = new; 1223597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 1233597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1243597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return new; 1253597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 1263597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1273597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_after(struct list *entry, struct list *new) 1283597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1293597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *next; 1303597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1313597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (entry) { 1323597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu next = entry->next; 1333597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (next) 1343597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu next->prev = new; 1353597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new->next = next; 1363597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new->prev = entry; 1373597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu entry->next = new; 1383597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1393597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return entry; 1403597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 1413597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1423597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return new; 1433597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 1443597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1453597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_head(struct list *list, struct list *new) 1463597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1473597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *first; 1483597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1493597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (list) { 1503597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu first = __list_first(list); 1513597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu __list_add_before(first, new); 1523597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 1533597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1543597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return new; 1553597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 1563597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1573597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_add_tail(struct list *list, struct list *new) 1583597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1593597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *last; 1603597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1613597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (list) { 1623597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu last = __list_last(list); 1633597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu __list_add_after(last, new); 1643597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1653597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return list; 1663597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 1673597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu else 1683597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return new; 1693597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 1703597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1713597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_add_head(struct list *list, void *data) 1723597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1733597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *new; 1743597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1753597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new = list_alloc(data); 1763597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (!new) 1773597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return NULL; 1783597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1793597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return __list_add_head(list, new); 1803597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 1813597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1823597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_add_tail(struct list *list, void *data) 1833597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1843597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *new; 1853597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1863597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu new = list_alloc(data); 1873597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (!new) 1883597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return NULL; 1893597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1903597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return __list_add_tail(list, new); 1913597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 1923597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1933597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_remove(struct list *list, struct list *entry) 1943597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 1953597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *prev, *next; 1963597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 1973597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (entry) { 1983597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu prev = entry->prev; 1993597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu next = entry->next; 2003597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2013597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (prev) 2023597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu prev->next = next; 2033597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu else 2043597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list = next; 2053597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (next) 2063597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu next->prev = prev; 2073597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2083597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu entry->prev = NULL; 2093597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu entry->next = NULL; 2103597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 2113597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2123597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return list; 2133597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 2143597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2153597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *__list_delete(struct list *list, 2163597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *entry) 2173597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 2183597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list = __list_remove(list, entry); 2193597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu __list_free(entry); 2203597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2213597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return list; 2223597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 2233597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2243597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_delete(struct list *list, void *data) 2253597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 2263597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *ptr, *tmp; 2273597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2283597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list_foreach_safe(list, ptr, tmp) { 2293597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (ptr->data == data) { 2303597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list = __list_delete(list, ptr); 2313597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu break; 2323597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 2333597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 2343597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2353597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return list; 2363597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 2373597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2383597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_delete_all(struct list *list, void *data) 2393597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 2403597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *ptr, *tmp; 2413597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2423597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list_foreach_safe(list, ptr, tmp) { 2433597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (ptr->data == data) 2443597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list = __list_delete(list, ptr); 2453597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 2463597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2473597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return list; 2483597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 2493597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2503597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_find(struct list *list, void *data) 2513597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 2523597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *ptr; 2533597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2543597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list_foreach(list, ptr) { 2553597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (ptr->data == data) 2563597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu break; 2573597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 2583597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2593597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return ptr; 2603597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 2613597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2623597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryustruct list *list_find_reverse(struct list *list, void *data) 2633597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu{ 2643597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu struct list *ptr; 2653597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2663597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu list_foreach_reverse(list, ptr) { 2673597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu if (ptr->data == data) 2683597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu break; 2693597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu } 2703597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu 2713597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu return ptr; 2723597788ce7c666b2e86df3932968f0745f4b7bd1Ho-Eun Ryu} 273