diff options
| author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-09-05 17:03:49 +0200 | 
|---|---|---|
| committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-09-05 17:03:49 +0200 | 
| commit | 247023e3fac41c99b5580d69262837429fb2bfed (patch) | |
| tree | f8cf9e42cffa38b8b0062512fc24bb4404386c42 /src/p_args_escape.c | |
| parent | Not quite done yet (diff) | |
| download | 42-minishell-247023e3fac41c99b5580d69262837429fb2bfed.tar.gz 42-minishell-247023e3fac41c99b5580d69262837429fb2bfed.tar.bz2 42-minishell-247023e3fac41c99b5580d69262837429fb2bfed.tar.xz 42-minishell-247023e3fac41c99b5580d69262837429fb2bfed.tar.zst 42-minishell-247023e3fac41c99b5580d69262837429fb2bfed.zip | |
Fuck shell
Diffstat (limited to 'src/p_args_escape.c')
| -rw-r--r-- | src/p_args_escape.c | 91 | 
1 files changed, 90 insertions, 1 deletions
| diff --git a/src/p_args_escape.c b/src/p_args_escape.c index 2a3a702..182ef2f 100644 --- a/src/p_args_escape.c +++ b/src/p_args_escape.c @@ -10,18 +10,105 @@  /*                                                                            */  /* ************************************************************************** */ +#include <libft.h>  #include <stddef.h>  #include "d_define.h" +#include "u_utils.h" + +static t_quote_mode +	p_escape_squote(char *ptr, char word[], t_quote_mode mode) +{ +	if (mode == Q_NONE) +	{ +		(void)ft_memmove(word + (ptr - word), ptr + 1, +			(ft_strlen(ptr + 1) + 1) * sizeof(char)); +		return (Q_SINGLE); +	} +	else if (mode == Q_SINGLE) +	{ +		(void)ft_memmove(word + (ptr - word), ptr + 1, +			(ft_strlen(ptr + 1) + 1) * sizeof(char)); +		return (Q_NONE); +	} +	return (mode); +} + +static t_quote_mode +	p_escape_dquote(char *ptr, char word[], t_quote_mode mode) +{ +	if (mode == Q_NONE) +	{ +		if (u_is_true_quote(word, ptr) == TRUE) +		{ +			(void)ft_memmove(word + (ptr - word), ptr + 1, +				(ft_strlen(ptr + 1) + 1) * sizeof(char)); +		} +		return (Q_DOUBLE); +	} +	else if (mode == Q_DOUBLE) +	{ +		if (u_is_true_quote(word, ptr) == TRUE) +		{ +			(void)ft_memmove(word + (ptr - word), ptr + 1, +				(ft_strlen(ptr + 1) + 1) * sizeof(char)); +		} +		return (Q_NONE); +	} +	return (mode); +} + +static void +	p_escape_bs(char *ptr, char word[], t_quote_mode mode) +{ +	if (mode == Q_NONE) +	{ +		(void)ft_memmove(word + (ptr - word), ptr + 1, +			(ft_strlen(ptr + 1) + 1) * sizeof(char)); +	} +	else if (mode == Q_DOUBLE) +	{ +		if (*(ptr + 1) == C_BS) +		{ +			(void)ft_memmove(word + (ptr - word), ptr + 1, +				(ft_strlen(ptr + 1) + 1) * sizeof(char)); +			*(word + (ptr - word)) = 26; +		} +		else if (*(ptr + 1) == C_DQUOTE) +		{ +			(void)ft_memmove(word + (ptr - word), ptr + 1, +				(ft_strlen(ptr + 1) + 1) * sizeof(char)); +		} +	} +}  static void -	p_escape_arg(char *ptr) +	p_escape_arg(char word[])  { +	char			*ptr;  	t_quote_mode	mode; +	ptr = word;  	mode = Q_NONE;  	while (*ptr != C_NULL)  	{ +		if (*ptr == C_SQUOTE) +			mode = p_escape_squote(ptr, word, mode); +		else if (*ptr == C_DQUOTE) +			mode = p_escape_dquote(ptr, word, mode); +		if (*ptr == C_BS) +			p_escape_bs(ptr, word, mode); +		ptr++; +	} +} + +static void +	p_replace_bs(char *ptr) +{ +	while (*ptr != C_NULL) +	{ +		if (*ptr == 26) +			*ptr = C_BS;  		ptr++;  	}  } @@ -32,12 +119,14 @@ void  	/* TODO: escape \ */  	/* TODO: escape $# special vars */  	/* TODO: escape my life */ +	/* TODO: comments */  	char	**ptr;  	ptr = words;  	while (*ptr != NULL)  	{  		p_escape_arg(*ptr); +		p_replace_bs(*ptr);  		ptr++;  	}  } | 
