/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* expand_brace.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/12 19:00:29 by wescande #+# #+# */ /* Updated: 2017/01/31 23:20:38 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "glob.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 : ** -char *pat -> pattern string to be looking for expand */ static char **gen_tab(const char *pat, const unsigned char *esc, int dup) { char **my_tab; if (!(my_tab = (char **)malloc(sizeof(char *) * 3))) return (NULL); if (dup) { my_tab[0] = ft_strdup(pat); my_tab[1] = ft_strdup((const char *)esc); } else { my_tab[0] = (char *)pat; my_tab[1] = (char *)esc; } my_tab[2] = NULL; return (my_tab); } static void iter_on_each(t_expand *me) { int i; char **my_new; char *first; unsigned char *second; t_ld *wk_tmp; i = -1; wk_tmp = *me->wk; while (me->split[++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), ft_strlen(me->split[i]), (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, 0); ft_ld_pushfront(&wk_tmp, my_new); } me->wk = &wk_tmp; } static void 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); } static int search_brace(t_expand *me) { char *start; int nb; start = NULL; nb = 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); if (!nb && start) { init_expand(me, start); return (1); } ++me->str; } return (0); } void expand_brace(t_glob *gl) { t_ld *tmp; int do_it; t_expand me; ft_ld_pushfront(&gl->m_pat, gen_tab("", (const unsigned char *)"", 1)); ft_ld_pushfront(&gl->m_pat, gen_tab(gl->pat, gl->esc, 1)); me = (t_expand){NULL, NULL, NULL, NULL, NULL, NULL}; do_it = 1; while (do_it) { do_it = 0; while (gl->m_pat->next && !do_it) { me.wk = &gl->m_pat; me.esc = UCH(gl->m_pat)[1]; me.str = CH(gl->m_pat)[0]; if ((tmp = gl->m_pat) && search_brace(&me)) { ft_ld_del(&tmp, &ft_tabdel); do_it = 1; } gl->m_pat = gl->m_pat->next; } gl->m_pat = ft_ld_front(gl->m_pat); } }