コード例 #1
0
ファイル: fmc_utils.c プロジェクト: anupam19/XperiaL_FM
FMC_ListNode *_FMC_UTILS_FindMatchingListNodeAndLoc(    FMC_ListNode                *listHead, 
                                                        FMC_ListNode                *prevNode,
                                                        FmcUtilsSearchDir           searchDir,
                                                        const FMC_ListNode      *nodeToMatch, 
                                                        FmcUtilsListComparisonFunc  comparisonFunc,
                                                        FMC_U32             *location)
{
    FMC_ListNode        *checkedNode = NULL;
    FMC_ListNode        *matchingNode = NULL;
    FMC_U32         tempLoc=0;
    FMC_FUNC_START("FMC_UTILS_FindMatchingListEntry");
    
    FMC_VERIFY_FATAL_SET_RETVAR((NULL != listHead), (matchingNode = NULL), ("Null list argument"));
    FMC_VERIFY_FATAL_SET_RETVAR((NULL != nodeToMatch), (matchingNode = NULL), ("Null nodeToMatch argument"));
    FMC_VERIFY_FATAL_SET_RETVAR((NULL != comparisonFunc), (matchingNode = NULL), ("Null comparisonFunc argument"));

    /* Assume a matching entry will not be found */
    matchingNode = NULL;

    /* Decide from which node to start the search */
    
    pthread_mutex_lock(&list_mutex);

    if (prevNode == NULL)
    {
        checkedNode = listHead;
    }
    else
    {
        checkedNode = prevNode;
    }
        
    if (searchDir == FMC_UTILS_SEARCH_FIRST_TO_LAST)
    {
        checkedNode = checkedNode->NextNode;
    }
    else
    {
        checkedNode = checkedNode->PrevNode;
    }

    /* Check all list entries, until a match is found, or list exhausted */
    while (checkedNode != listHead)
    {
        tempLoc ++;
        /* Check the current entry, using the specified comparison function */
        
        if (FMC_TRUE == comparisonFunc(nodeToMatch, checkedNode))
        {
            matchingNode = checkedNode;

            /* entry matches, stop comparing */
            break;
        }

        /* Move on to check the next entry, according to the search direction */
        if (searchDir == FMC_UTILS_SEARCH_FIRST_TO_LAST)
        {
            checkedNode = checkedNode->NextNode;
        }
        else
        {
            checkedNode = checkedNode->PrevNode;
        }
    }
    *location = tempLoc;

    pthread_mutex_unlock(&list_mutex);

    FMC_FUNC_END();
    
    return matchingNode;
}
コード例 #2
0
MCP_DL_LIST_Node *MCP_DL_LIST_FindMatchingNode(	MCP_DL_LIST_Node			 	*listHead, 
														MCP_DL_LIST_Node				*prevNode,
														McpDlListSearchDir			searchDir,
														const MCP_DL_LIST_Node		*nodeToMatch, 
														McpDlListComparisonFunc	comparisonFunc)
{
	MCP_DL_LIST_Node	*checkedNode = NULL;
	MCP_DL_LIST_Node	*matchingNode = NULL;
	
	MCP_FUNC_START("MCP_DL_LIST_UTILS_FindMatchingListEntry");
	
	MCP_VERIFY_FATAL_SET_RETVAR((NULL != listHead), (matchingNode = NULL), ("Null list argument"));
	MCP_VERIFY_FATAL_SET_RETVAR((NULL != nodeToMatch), (matchingNode = NULL), ("Null nodeToMatch argument"));
	MCP_VERIFY_FATAL_SET_RETVAR((NULL != comparisonFunc), (matchingNode = NULL), ("Null comparisonFunc argument"));

	/* Assume a matching entry will not be found */
	matchingNode = NULL;

	/* Decide from which node to start the search */
	
	if (prevNode == NULL)
	{
		checkedNode = listHead;
	}
	else
	{
		checkedNode = prevNode;
	}
		
	if (searchDir == MCP_DL_LIST_SEARCH_DIR_FIRST_TO_LAST)
	{
		checkedNode = checkedNode->next;
	}
	else
	{
		checkedNode = checkedNode->prev;
	}

	/* Check all list entries, until a match is found, or list exhausted */
	while (checkedNode != listHead)
	{
		/* Check the current entry, using the specified comparison function */
		if (MCP_TRUE == comparisonFunc(nodeToMatch, checkedNode))
		{
			matchingNode = checkedNode;

			/* entry matches, stop comparing */
			break;
		}

		/* Move on to check the next entry, according to the search direction */
		if (searchDir == MCP_DL_LIST_SEARCH_DIR_FIRST_TO_LAST)
		{
			checkedNode = checkedNode->next;
		}
		else
		{
			checkedNode = checkedNode->prev;
		}
	}
	
	MCP_FUNC_END();
	
	return matchingNode;
}