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; }
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; }