/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   b_alias_print.c                                    :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: rbousset <marvin@42.fr>                    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/02/14 17:19:27 by rbousset          #+#    #+#             */
/*   Updated: 2020/02/14 17:19:29 by rbousset         ###   ########lyon.fr   */
/*                                                                            */
/* ************************************************************************** */

#include <libft.h>
#include <stdlib.h>
#ifdef __linux__
# include <linux/limits.h>
#else
# include <limits.h>
#endif

#include "d_define.h"
#include "s_struct.h"

static char	**b_alloc_buff(t_lalias *ptr, size_t i)
{
	char	**buff;

	if ((buff = (char**)malloc((i + 1) * sizeof(char*))) == NULL)
		return (NULL);
	i = 0;
	while (ptr != NULL)
	{
		buff[i + 1] = NULL;
		if ((buff[i] = (char*)malloc((6 + ft_strlen(ptr->name) + 2
			+ ft_strlen(ptr->val) + 3) * sizeof(char))) == NULL)
		{
			ft_delwords(buff);
			return (NULL);
		}
		ptr = ptr->next;
		i++;
	}
	return (buff);
}

static void	b_fill_buff(t_lalias *ptr, char *buff[])
{
	size_t	i;

	i = 0;
	while (ptr != NULL)
	{
		ft_sprintf(buff[i], "alias %s='%s'\n", ptr->name, ptr->val);
		ptr = ptr->next;
		i++;
	}
}

static void	b_sort_buff(char *buff[])
{
	size_t	i;
	int		cmp;
	char	tmp[ARG_MAX];

	i = 1;
	while (buff[i] != NULL)
	{
		if ((cmp = ft_strncmp(buff[i - 1], buff[i], ARG_MAX)) > 0)
		{
			ft_strlcpy(tmp, buff[i - 1], ARG_MAX);
			ft_memdel((void*)&buff[i - 1]);
			if ((buff[i - 1] = ft_strdup(buff[i])) == NULL)
				return ;
			ft_memdel((void*)&buff[i]);
			if ((buff[i] = ft_strdup(tmp)) == NULL)
				return ;
			i = 0;
		}
		i++;
	}
}

static void	b_print_buff(char *buff[])
{
	char	**ptr;

	ptr = buff;
	while (*ptr != NULL)
	{
		ft_printf("%s", *ptr);
		ptr++;
	}
}

void		b_print_alias_list(t_msh *msh)
{
	t_lalias	*ptr;
	char		**buff;
	size_t		i;

	ptr = msh->alias;
	i = 0;
	while (ptr != NULL)
	{
		ptr = ptr->next;
		i++;
	}
	ptr = msh->alias;
	if ((buff = b_alloc_buff(ptr, i)) == NULL)
		return ;
	ptr = msh->alias;
	b_fill_buff(ptr, buff);
	b_sort_buff(buff);
	b_print_buff(buff);
	ft_delwords(buff);
}