18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2011, The Linux Foundation. All rights reserved. 28c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 38c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Redistribution and use in source and binary forms, with or without 48c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * modification, are permitted provided that the following conditions are 58c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * met: 68c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions of source code must retain the above copyright 78c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * notice, this list of conditions and the following disclaimer. 88c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Redistributions in binary form must reproduce the above 98c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * copyright notice, this list of conditions and the following 108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * disclaimer in the documentation and/or other materials provided 118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * with the distribution. 128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * * Neither the name of The Linux Foundation nor the names of its 138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * contributors may be used to endorse or promote products derived 148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * from this software without specific prior written permission. 158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * 168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */ 288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "linked_list.h" 308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdio.h> 318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <string.h> 328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_TAG "LocSvc_utils_ll" 348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "log_util.h" 358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "platform_lib_includes.h" 368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdlib.h> 378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdint.h> 388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 398c2d3d5afc51d3f35150f748f263870367771b6fEd Tamtypedef struct list_element { 408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam struct list_element* next; 418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam struct list_element* prev; 428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam void* data_ptr; 438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam void (*dealloc_func)(void*); 448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}list_element; 458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 468c2d3d5afc51d3f35150f748f263870367771b6fEd Tamtypedef struct list_state { 478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_element* p_head; 488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_element* p_tail; 498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} list_state; 508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* ----------------------- END INTERNAL FUNCTIONS ---------------------------------------- */ 528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FUNCTION: linked_list_init 568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ===========================================================================*/ 588c2d3d5afc51d3f35150f748f263870367771b6fEd Tamlinked_list_err_type linked_list_init(void** list_data) 598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( list_data == NULL ) 618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__); 638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_PARAMETER; 648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_state* tmp_list; 678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp_list = (list_state*)calloc(1, sizeof(list_state)); 688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( tmp_list == NULL ) 698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Unable to allocate space for list!\n", __FUNCTION__); 718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_FAILURE_GENERAL; 728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp_list->p_head = NULL; 758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp_list->p_tail = NULL; 768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *list_data = tmp_list; 788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_SUCCESS; 808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FUNCTION: linked_list_destroy 858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ===========================================================================*/ 878c2d3d5afc51d3f35150f748f263870367771b6fEd Tamlinked_list_err_type linked_list_destroy(void** list_data) 888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( list_data == NULL ) 908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__); 928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_HANDLE; 938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_state* p_list = (list_state*)*list_data; 968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam linked_list_flush(p_list); 988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam free(*list_data); 1008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *list_data = NULL; 1018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_SUCCESS; 1038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FUNCTION: linked_list_add 1088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ===========================================================================*/ 1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tamlinked_list_err_type linked_list_add(void* list_data, void *data_obj, void (*dealloc)(void*)) 1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s: Adding to list data_obj = 0x%08X\n", __FUNCTION__, data_obj); 1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( list_data == NULL ) 1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__); 1168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_HANDLE; 1178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( data_obj == NULL ) 1208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid input parameter!\n", __FUNCTION__); 1228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_PARAMETER; 1238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_state* p_list = (list_state*)list_data; 1268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_element* elem = (list_element*)malloc(sizeof(list_element)); 1278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( elem == NULL ) 1288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Memory allocation failed\n", __FUNCTION__); 1308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_FAILURE_GENERAL; 1318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Copy data to newly created element */ 1348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam elem->data_ptr = data_obj; 1358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam elem->next = NULL; 1368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam elem->prev = NULL; 1378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam elem->dealloc_func = dealloc; 1388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Replace head element */ 1408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_element* tmp = p_list->p_head; 1418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_head = elem; 1428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Point next to the previous head element */ 1438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_head->next = tmp; 1448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( tmp != NULL ) 1468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp->prev = p_list->p_head; 1488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam else 1508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_tail = p_list->p_head; 1528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_SUCCESS; 1558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 1568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 1588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FUNCTION: linked_list_remove 1608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ===========================================================================*/ 1628c2d3d5afc51d3f35150f748f263870367771b6fEd Tamlinked_list_err_type linked_list_remove(void* list_data, void **data_obj) 1638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 1648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s: Removing from list\n", __FUNCTION__); 1658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( list_data == NULL ) 1668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__); 1688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_HANDLE; 1698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( data_obj == NULL ) 1728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid input parameter!\n", __FUNCTION__); 1748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_PARAMETER; 1758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_state* p_list = (list_state*)list_data; 1788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( p_list->p_tail == NULL ) 1798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_UNAVAILABLE_RESOURCE; 1818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_element* tmp = p_list->p_tail; 1848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Replace tail element */ 1868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_tail = tmp->prev; 1878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( p_list->p_tail != NULL ) 1898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_tail->next = NULL; 1918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam else 1938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 1948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_head = p_list->p_tail; 1958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 1968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 1978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Copy data to output param */ 1988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *data_obj = tmp->data_ptr; 1998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Free allocated list element */ 2018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam free(tmp); 2028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_SUCCESS; 2048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 2078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FUNCTION: linked_list_empty 2098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ===========================================================================*/ 2118c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint linked_list_empty(void* list_data) 2128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 2138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( list_data == NULL ) 2148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__); 2168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return (int)eLINKED_LIST_INVALID_HANDLE; 2178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam else 2198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_state* p_list = (list_state*)list_data; 2218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return p_list->p_head == NULL ? 1 : 0; 2228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 2268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FUNCTION: linked_list_flush 2288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ===========================================================================*/ 2308c2d3d5afc51d3f35150f748f263870367771b6fEd Tamlinked_list_err_type linked_list_flush(void* list_data) 2318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 2328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( list_data == NULL ) 2338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__); 2358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_HANDLE; 2368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_state* p_list = (list_state*)list_data; 2398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Remove all dynamically allocated elements */ 2418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam while( p_list->p_head != NULL ) 2428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_element* tmp = p_list->p_head->next; 2448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Free data pointer if told to do so. */ 2468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( p_list->p_head->dealloc_func != NULL ) 2478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_head->dealloc_func(p_list->p_head->data_ptr); 2498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam /* Free list element */ 2528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam free(p_list->p_head); 2538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_head = tmp; 2558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_tail = NULL; 2588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_SUCCESS; 2608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 2618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=========================================================================== 2638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam FUNCTION: linked_list_search 2658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam ===========================================================================*/ 2678c2d3d5afc51d3f35150f748f263870367771b6fEd Tamlinked_list_err_type linked_list_search(void* list_data, void **data_p, 2688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam bool (*equal)(void* data_0, void* data), 2698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam void* data_0, bool rm_if_found) 2708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ 2718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGD("%s: Search the list\n", __FUNCTION__); 2728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( list_data == NULL || NULL == equal ) 2738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam LOC_LOGE("%s: Invalid list parameter! list_data %p equal %p\n", 2758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam __FUNCTION__, list_data, equal); 2768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_INVALID_HANDLE; 2778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_state* p_list = (list_state*)list_data; 2808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if( p_list->p_tail == NULL ) 2818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam { 2828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_UNAVAILABLE_RESOURCE; 2838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam list_element* tmp = p_list->p_head; 2868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (NULL != data_p) { 2888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *data_p = NULL; 2898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam while (NULL != tmp) { 2928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if ((*equal)(data_0, tmp->data_ptr)) { 2938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (NULL != data_p) { 2948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *data_p = tmp->data_ptr; 2958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 2968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 2978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (rm_if_found) { 2988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (NULL == tmp->prev) { 2998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_head = tmp->next; 3008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } else { 3018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp->prev->next = tmp->next; 3028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (NULL == tmp->next) { 3058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam p_list->p_tail = tmp->prev; 3068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } else { 3078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp->next->prev = tmp->prev; 3088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp->prev = tmp->next = NULL; 3118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam // dealloc data if it is not copied out && caller 3138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam // has given us a dealloc function pointer. 3148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam if (NULL == data_p && NULL != tmp->dealloc_func) { 3158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp->dealloc_func(tmp->data_ptr); 3168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam free(tmp); 3188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp = NULL; 3218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } else { 3228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam tmp = tmp->next; 3238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam } 3258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 3268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam return eLINKED_LIST_SUCCESS; 3278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} 3288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam 329