/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* expand_brace.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/12 19:00:29 by wescande #+# #+# */ /* Updated: 2017/03/07 20:03:35 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" /* ** expand_brace return expansion of a string. ** pattern searched are {ab, cd}. ** return is t_ld which first param is ab and second is cd ** input parameters are : ** -t_glob *gl -> struct of expanding */ static void iter_on_each(t_expand *me) { int i; char **my_new; char *first; unsigned char *second; t_ld *wk_tmp; i = ft_tablen(me->split); wk_tmp = *me->wk; while (i--) { first = ft_strjoinf(ft_strjoin(me->s1, me->split[i]), me->str + 1, 1); second = calc_expand_esc(me->esc, ft_strlen(me->s1), (int[2]){ft_strlen(me->split[i]), 0}, (int[2]){me->str - CH(*me->wk)[0], ft_strlen(me->str + 1)}); modify_esc_split(second, me->m_esc[i], ft_strlen(me->s1), ft_strlen(me->split[i])); my_new = gen_tab(first, second, NULL, 0); ft_ld_pushfront(me->wk, my_new); } me->wk = &wk_tmp; } static int init_expand(t_expand *me, char *start) { unsigned char *esc; me->s1 = ft_strsub(start, 1, me->str - start - 1); esc = ft_sub_esc(me->esc, start - CH(*me->wk)[0] + 1, me->str - start); me->split = ft_strsplit_spe(me->s1, esc, ','); me->m_esc = ft_strsplit_esc(me->s1, esc, ','); ft_strdel(&me->s1); ft_strdel((char **)&esc); me->s1 = ft_strsub(CH(*me->wk)[0], 0, start - CH(*me->wk)[0]); iter_on_each(me); ft_strdel(&me->s1); ft_tabdel(&me->split); ft_tabdel((char ***)&me->m_esc); return (1); } static int search_brace(t_expand *me) { char *start; int com; int nb; start = NULL; nb = 0; com = 0; while (*++me->str) { start = *me->str == '{' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str) && nb == 0 ? me->str : start; nb += *me->str == '{' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str); nb -= *me->str == '}' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str); com += *me->str == ',' && !is_char_esc(me->esc, CH(*me->wk)[0], me->str) && nb == 1; if (!nb && start) { if (com) return (init_expand(me, start)); set_char_esc(me->esc, CH(*me->wk)[0], start); set_char_esc(me->esc, CH(*me->wk)[0], me->str); return (2); } } return (0); } void expand_brace(t_glob *gl) { t_ld *tmp; int do_it; t_expand me; me = (t_expand){NULL, NULL, NULL, NULL, NULL, NULL}; do_it = 1; while (do_it) { do_it = 0; while (gl->m_pat && !do_it) { me.wk = &gl->m_pat; me.esc = UCH(gl->m_pat)[1]; me.str = CH(gl->m_pat)[0]; --me.str; if ((tmp = gl->m_pat) && (do_it = search_brace(&me)) == 1) ft_ld_del(&tmp, &ft_tabdel); if (!gl->m_pat->next) break ; gl->m_pat = gl->m_pat->next; } gl->m_pat = ft_ld_front(gl->m_pat); } }