42-archive/42sh/src/glob/expand_var.c
2017-03-07 18:37:13 +01:00

85 lines
2.6 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* expand_var.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/06 16:09:27 by wescande #+# #+# */
/* Updated: 2017/03/07 12:07:53 by wescande ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
/*
** expand_var return value of $var in the string.
** input parameters are :
** -t_glob *gl -> struct of expanding
*/
static void insert_var(t_glob *gl, char *pos, char *name, char *content)
{
char *s1;
char *s2;
int delta;
unsigned char *new_esc;
delta = pos - gl->pat;
s1 = ft_strsub(gl->pat, 0, delta);
delta += ft_strlen(name) + 1;
s2 = ft_strsubf(gl->pat, delta, ft_strlen(gl->pat) - delta, 1);
gl->pat = ft_strjoinf(ft_strjoin(s1, content), s2, 1);
new_esc = calc_expand_esc(gl->esc, ft_strlen(s1),
(int[2]){ft_strlen(content), 1},
(int[2]){delta, ft_strlen(s2)});
ft_memdel((void **)&gl->esc);
gl->esc = new_esc;
new_esc = calc_expand_esc(gl->esc2, ft_strlen(s1),
(int[2]){ft_strlen(content), 1},
(int[2]){delta, ft_strlen(s2)});
ft_memdel((void **)&gl->esc2);
gl->esc2 = new_esc;
ft_strdel(&s1);
ft_strdel(&s2);
}
static char *get_name(t_glob *gl, const char *pat)
{
const char *str;
str = pat;
if (ft_isdigit(*str))
return (ft_strsub(pat, 0, str - pat + 1));
if (*str == '?')
return (ft_strsub(pat, 0, str - pat + 1));
while ((ft_isalnum(*str) || *str == '_' || *str == '-')
&& !is_char_esc(gl->esc2, gl->pat, str))
++str;
return (ft_strsub(pat, 0, str - pat));
}
void expand_var(t_glob *gl)
{
char *pat;
char *var;
char *content;
pat = gl->pat;
while (*pat)
{
if (*pat == '$' && !is_char_esc(gl->esc2, gl->pat, pat) &&
(var = get_name(gl, pat + 1)))
{
if (var && *var)
{
if (!(content = ft_getenv(data_singleton()->env, var)))
content = ft_getenv(data_singleton()->local_var, var);
insert_var(gl, pat, var, content);
pat = gl->pat;
}
ft_strdel(&var);
}
++pat;
}
}