/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* m_loop.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ /* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include #include #include #include #ifdef __linux__ # include #else # include #endif #include "c_init.h" #include "c_utils_next.h" #include "c_ctrls.h" #include "d_define.h" #include "e_line.h" #include "m_argv.h" #include "m_loop_multis.h" #include "m_prompt.h" #include "p_lblock.h" #include "p_line.h" #include "s_com.h" #include "s_lpipes.h" #include "s_line.h" #include "u_utils.h" #include "u_parse.h" #include "u_vars.h" #include "u_vars_next.h" static void m_parse_and_run_line(char line[], unsigned char previf, t_msh *msh) { t_line_block *ptr; size_t i; t_bool pipe; p_line(line, msh); ptr = msh->curr; while (ptr != NULL) { if ((previf == 0) || (previf == 1 && msh->ret == 0) || (previf == 2 && msh->ret != 0)) { pipe = p_find_good_pipe(ptr->lblock); if ((pipe == TRUE && s_split_pipes(ptr->lblock, msh) == NULL) || (msh->com = s_com_new(ptr->lblock, msh)) == NULL) { previf = ptr->nextif; ptr = ptr->next; continue ; } if (msh->com != NULL && pipe == FALSE) { i = 0; while (msh->com->argv != NULL && msh->com->argv[i] != NULL) i++; if (msh->com->argv != NULL && msh->com->argv[0] != NULL) u_subst_var_value("$_", msh->com->argv[i - 1], msh); else u_subst_var_value("$_", msh->com->bin, msh); } e_line_block(msh); s_com_destroy(&msh->com); s_lpipes_clear(&msh->pipes); } previf = ptr->nextif; ptr = ptr->next; } s_line_clear(&msh->curr); } void m_dump_hist(char hist[], t_msh *msh) { char histfile[PATH_MAX]; int fd; if (hist[0] != C_NUL && ft_strlen(hist) > 0) { u_get_var_value(histfile, "$HISTFILE", PATH_MAX, msh); if (histfile[0] != C_NUL) { if ((fd = open(histfile, O_WRONLY | O_CREAT | O_APPEND, 0644)) != -1) { ft_dprintf(fd, "%s", hist); close(fd); } } } } static void m_handle_hist(char hist[], char line[], t_msh *msh) { static unsigned short hist_i = 0; if (hist_i == 0) hist[0] = '\0'; ft_strlcpy(hist + ft_strlen(hist), line, 4096); hist[ft_strlen(hist) + 1] = '\0'; hist[ft_strlen(hist)] = '\n'; hist_i += 1; if (hist_i == 254) { m_dump_hist(hist, msh); ft_memdel((void*)&msh->prev_hist); msh->prev_hist = m_get_prev_hist(msh); hist_i = 0; } } static void m_delete_comments(char line[]) { char *ptr; t_quote_mode mode; ptr = line; mode = Q_NONE; while (*ptr != C_NUL) { if (*ptr == C_DQUOTE) mode = u_meet_dquote(line, ptr, mode); else if (*ptr == C_SQUOTE) mode = u_meet_squote(line, ptr, mode); else if (mode == Q_NONE && *ptr == C_SHARP && u_is_not_escaped(line, ptr) == TRUE) { if (ptr - line == 0) *ptr = C_NUL; else if (ptr - line > 0 && ft_iswhitespace(*(ptr - 1)) == TRUE && u_is_not_escaped(line, ptr - 1) == TRUE) *ptr = C_NUL; } ptr++; } } unsigned char m_loop(int fd, t_msh *msh) { static char hist[255 * 4096]; char *line; char gnl; gnl = 1; msh->curr_hist_ptr = hist; while (gnl > 0) { gnl = (fd == STDIN_FILENO) ? c_gnl(fd, &line, 1, msh) : get_next_line(fd, &line); m_delete_comments(line); if (line[0] != C_NUL) { line = m_check_multis(fd, line, msh); if (fd == STDIN_FILENO) m_handle_hist(hist, line, msh); m_parse_and_run_line(line, 0, msh); c_set_ptr(TRUE, 0, msh); } else ft_memdel((void*)&line); } if (fd == STDIN_FILENO) m_dump_hist(hist, msh); return (msh->ret); }