void ft_list_remove_if(t_list **begin_list, void *data_ref, \ in"> void ft_list_remove_if(t_list **begin_list, void *data_ref, \ in"> void ft_list_remove_if(t_list **begin_list, void *data_ref, \ in">
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_list_remove_if.c                                :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: jayang <[email protected]>                      +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2022/02/23 19:46:11 by jayang            #+#    #+#             */
/*   Updated: 2022/02/24 10:51:15 by jayang           ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "ft_list.h"
#include <stdlib.h>

void	ft_list_remove_if(t_list **begin_list, void *data_ref, \\
		int (*cmp)(), void (*free_fct)(void *))
{
	t_list	*next_level;
	t_list	*tmp;

	if (*begin_list == 0)
		return ;
	next_level = *begin_list;
	while (next_level && next_level->next)
	{
		if ((*cmp)(next_level->next->data, data_ref) == 0)
		{
			tmp = next_level->next;
			(*free_fct)(tmp->data);
			next_level->next = next_level->next->next;
			free(tmp);
		}
		next_level = next_level->next;
	}
	next_level = *begin_list;
	if (next_level && (*cmp)(next_level->data, data_ref) == 0)
	{
		*begin_list = next_level->next;
		(*free_fct)(next_level);
		free(next_level);
	}
}