/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* u_init.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 #include "b_exit.h" #include "c_ctrls.h" #include "c_init.h" #include "c_keys.h" #include "c_utils_next.h" #include "c_input.h" #include "c_utils.h" #include "c_utils_next.h" #include "d_define.h" #include "m_prompt.h" #include "s_struct.h" #include "s_com.h" #include "s_line.h" short c_set_term_raw(char mode) { struct termios tios; ft_memset(&tios, 0, sizeof(tios)); tcgetattr(STDIN_FILENO, &tios); if (mode) { tios.c_lflag &= ~(ECHO | ICANON | ISIG); tios.c_oflag &= ~(OPOST); tios.c_cc[VMIN] = 1; tios.c_cc[VTIME] = 0; } else { tios.c_lflag |= (ECHO | ICANON | ISIG); tios.c_oflag |= (OPOST); } tcsetattr(STDIN_FILENO, TCSAFLUSH, &tios); mode ? tputs(tgetstr("ns", NULL), 1, ft_putchar) : 0; return (1); } static short c_read_cap(char *buf, char *line, t_caps *tcaps, t_msh *msh) { if (((*((unsigned int *)buf)) == LEFT_K) || ((*((unsigned int *)buf)) == CTRL_B)) return (c_key_left(tcaps->plen, tcaps)); else if (((*((unsigned int *)buf)) == RIGHT_K) || ((*((unsigned int *)buf)) == CTRL_F)) return (c_key_right(ft_strlen(line), tcaps->plen, tcaps)); else if (((*((unsigned int *)buf)) == HOME_K) || ((*((unsigned int *)buf)) == CTRL_A)) return (c_home_key(tcaps->plen, tcaps)); else if (((*((unsigned int *)buf)) == END_K) || ((*((unsigned int *)buf)) == CTRL_E)) return (c_end_key(ft_strlen(line), tcaps->plen, tcaps)); else if ((*((unsigned int *)buf)) == CTRL_L) return (c_ctrl_l(line, tcaps, msh)); else if ((*((unsigned int *)buf)) == CTRL_D && line[0] == '\0') return (c_ctrl_d(line, msh)); return (0); } char *c_set_ptr(t_bool reset, char key, t_msh *msh) { static char *p = NULL; static char *context = NULL; static t_bool sw = FALSE; if (reset == TRUE) { p = msh->curr_hist_ptr + ft_strlen(msh->curr_hist_ptr); context = msh->curr_hist_ptr; return (NULL); } if (key == -1 && context == msh->curr_hist_ptr && p - context == 0 && msh->prev_hist != NULL) { p = msh->prev_hist + ft_strlen(msh->prev_hist); context = msh->prev_hist; } if (key == 1 && context == msh->prev_hist && p == ft_strrnchr(msh->prev_hist, '\n', 2) + 1) { p = msh->curr_hist_ptr; context = msh->curr_hist_ptr; sw = TRUE; } c_set_ptr_norme(key, &sw, &p, &context); return (p); } static char *c_process_key(char **line, char *buf, t_caps *tcaps, t_msh *msh) { if (ft_isprint(buf[0]) && *line != NULL) c_add_char(line, buf, tcaps); else if (((*((unsigned int *)buf)) == UP_K) || ((*((unsigned int *)buf)) == CTRL_P) || ((*((unsigned int *)buf)) == DOWN_K) || ((*((unsigned int *)buf)) == CTRL_N)) { tcaps->key = c_set_key(buf); c_key_up_down(line, tcaps, msh); } else if ((*((unsigned int *)buf)) == DEL_K) { c_back_slash(line, tcaps->plen, tcaps); if ((((tcaps->cpos) + tcaps->plen) % tcaps->ws.ws_col) == 0) return (NULL); c_redraw_line(*line, tcaps); } else if ((*((unsigned int *)buf)) == CTRL_C) return (c_ctrl_c(line, buf, msh)); else c_read_cap(buf, *line, tcaps, msh); return ((buf[0] == '\n') ? c_new_line(tcaps) : NULL); } short c_gnl(int fd, char **line, char psx, t_msh *msh) { t_caps tcaps; char nread[4]; c_init_line(psx, &tcaps, msh); tputs(tgetstr("cr", NULL), 1, ft_putchar); m_prompt_psx(psx, msh); ft_bzero(nread, 4); msh->sig = 0; tcaps.plen = (unsigned int)m_plen(msh->ps[psx - 1]); *line = NULL; if (!(*line = ft_calloc(sizeof(char), 1))) return (-1); if (!(c_get_win_size(&tcaps.ws))) return (-1); while (!(ft_strchr(nread, '\n'))) { ft_bzero(nread, 4); if (!(read(fd, nread, 3))) return (0); else c_process_key(line, nread, &tcaps, msh); tputs(tgetstr("ve", NULL), 1, ft_putchar); } return (1); }