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