diff options
Diffstat (limited to 'src/s_com.c')
| -rw-r--r-- | src/s_com.c | 130 | 
1 files changed, 130 insertions, 0 deletions
| diff --git a/src/s_com.c b/src/s_com.c new file mode 100644 index 0000000..576b407 --- /dev/null +++ b/src/s_com.c @@ -0,0 +1,130 @@ +/* ************************************************************************** */ +/*                                                                            */ +/*                                                        :::      ::::::::   */ +/*   s_com.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> + +#include "f_fail.h" +#include "p_lcom.h" +#include "p_lcom_next.h" +#include "s_struct.h"	 + +static int8_t +	fill_com(char *words[], +				t_com **com) +{ +	/* TODO: norme */ +	uint64_t	i; +	uint64_t	j; + +	i = 0; +	if (words[0]) +	{ +		if (((*com)->bin = (char*)malloc((ft_strlen(words[0]) + 1) * +			sizeof(char))) == NULL) +			return (-1); +		ft_strlcpy((*com)->bin, words[0], ft_strlen(words[0]) + 1); +	} +	else +		return (0); +	while(words[i]) +	{ +		/* TODO: cut fd number "msh ~> echo a 2>file" */ +		/*                                    ^       */ +		if (ft_ischarset("<>", words[i][0])) +			break ; +		i++; +	} +	if (!((*com)->argv = (char**)malloc((i + 1) * sizeof(char*)))) +		return (-1); +	j = 0; +	while (i > 0 && j < i) +	{ +		if (!((*com)->argv[j] = ft_strdup(words[j]))) +			return (-1); +		j++; +	} +	(*com)->argv[j] = 0; +	return (0); +} + +static void +	com_cpy_env_fork(t_com **com, +					t_msh *msh) +{ +	size_t	i; +	size_t	j; + +	i = 0; +	while (msh->env_fork_tmp[i][0] != '\0') +		i++; +	if (((*com)->env_fork = (char**)malloc((i + 1) * sizeof(char*))) == NULL) +		f_alloc_and_destroy_msh(msh); +	j = 0; +	while (j < i) +	{ +		if (((*com)->env_fork[j] = ft_strdup(msh->env_fork_tmp[j])) == NULL) +			f_alloc_and_destroy_msh(msh); +		j++; +	} +	(*com)->env_fork[j] = NULL; +} + +void +	s_com_destroy(t_com **com) +{ +	t_com	*ptr; + +	ptr = *com; +	ft_memdel((void*)&ptr->bin); +	if (ptr->argv != NULL) +		ft_delwords(ptr->argv); +	if (ptr->redir != 0) +		ft_memdel((void*)&ptr->rdrpath); +	if (ptr->env_fork != NULL) +		ft_delwords(ptr->env_fork); +	ft_memdel((void*)&ptr); + +} + +t_com +	*s_com_new(char word[], +			t_msh *msh) +{ +	t_com	*com; +	char	**words; + +	if ((com = (t_com*)malloc(sizeof(t_com))) == NULL) +		return (NULL); +	com->redir = 0; +	com->bin = NULL; +	com->argv = NULL; +	com->rdrfd = 0; +	com->rdrpath = NULL; +	com->env_fork = NULL; +	if (get_redir(word, &com) != 0) +		return (NULL); +	if (!(words = p_subst_args(word, com->redir))) +		return (NULL); +	if (!(words = p_subst_vars(words, msh))) +		return (NULL); +	words = p_check_args_equals(words, msh); +	if (msh->env_fork_tmp[0][0] != '\0') +		com_cpy_env_fork(&com, msh); +	if (fill_com(words, &com) < 0) +	{ +		ft_delwords(words); +		return (NULL); +	} +	ft_delwords(words); +	return (com); +} | 
