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