From bd33e1c9f20685643bb316d6c730dc0ed90a80cc Mon Sep 17 00:00:00 2001 From: Gautier WOJDA Date: Thu, 26 Jan 2017 14:17:07 +0100 Subject: [PATCH] ajout du control + R pour la recherche dans l'historique (j'ai prit pour exemple bash), et du \ en cas de \ en fin de ligne --- 42sh/includes/ft_readline.h | 8 +- 42sh/src/line-editing/check_backslash.c | 35 ++++++++ 42sh/src/line-editing/get_touch.c | 7 +- .../line-editing/history_parsing_toolz_2.c | 4 +- 42sh/src/line-editing/readline.c | 12 +-- 42sh/src/line-editing/surch_in_history.c | 83 +++++++++++++++++++ 6 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 42sh/src/line-editing/check_backslash.c create mode 100644 42sh/src/line-editing/surch_in_history.c diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index 24e96a51..af343cd1 100644 --- a/42sh/includes/ft_readline.h +++ b/42sh/includes/ft_readline.h @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/23 10:35:44 by gwojda #+# #+# */ -/* Updated: 2017/01/25 20:04:33 by gwojda ### ########.fr */ +/* Updated: 2017/01/26 13:36:59 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,6 +36,7 @@ # define TOUCHE_DELETE 2117294875 # define TOUCHE_CTRL_C 3 # define TOUCHE_CTRL_D 4 +# define TOUCHE_CTRL_R 18 # define TOUCHE_HOME 4741915 # define TOUCHE_END 4610843 # define TOUCHE_TAB 9 @@ -51,6 +52,8 @@ # define HIST 1 +# define ERROR_CNTL_R 1 + typedef struct s_list_history { char *str; @@ -68,6 +71,9 @@ typedef struct s_line t_list_history *list_beg; } t_line; +void ft_check_backslash(char **str); +char *ft_strget_history(char *str); +void ft_surch_in_history(char **str, size_t *pos); void ft_realloc_str_history_3(char **str, size_t pos, char *s); void ft_move_right(size_t *pos, char *str); void ft_move_left(size_t *pos, char *str); diff --git a/42sh/src/line-editing/check_backslash.c b/42sh/src/line-editing/check_backslash.c new file mode 100644 index 00000000..fa91a8ab --- /dev/null +++ b/42sh/src/line-editing/check_backslash.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_backslash.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gwojda +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/26 13:32:52 by gwojda #+# #+# */ +/* Updated: 2017/01/26 13:50:00 by gwojda ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void ft_check_backslash(char **str) +{ + char *tmp1; + char *tmp2; + + if (!*str) + return ; + if ((*str)[ft_strlen(*str) - 1] == '\\') + { + ft_putstr("> "); + data_singleton()->line.prompt_size = 2; + tmp1 = *str; + tmp2 = ft_strjoin(tmp1, "\n"); + free(tmp1); + tmp1 = ft_lecture(data_singleton()->line.list_beg); + *str = ft_strjoin(tmp2, tmp1); + free(tmp1); + free(tmp2); + ft_putchar('\n'); + } +} diff --git a/42sh/src/line-editing/get_touch.c b/42sh/src/line-editing/get_touch.c index 375303a1..affc537c 100644 --- a/42sh/src/line-editing/get_touch.c +++ b/42sh/src/line-editing/get_touch.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/19 16:28:49 by gwojda #+# #+# */ -/* Updated: 2017/01/25 16:26:30 by gwojda ### ########.fr */ +/* Updated: 2017/01/26 11:36:19 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -73,6 +73,11 @@ char *ft_lecture(t_list_history *head) read(0, &ret, sizeof(int)); if (ret == TOUCHE_F6 && read(0, &ret, sizeof(int)) > 0) continue ; + if (ret == TOUCHE_CTRL_R) + { + ft_surch_in_history(&str, &i); + continue ; + } /* ** if (ret == TOUCHE_TAB) ** ret = ft_completion(&str, &i); diff --git a/42sh/src/line-editing/history_parsing_toolz_2.c b/42sh/src/line-editing/history_parsing_toolz_2.c index eda2bcf0..23ce77ae 100644 --- a/42sh/src/line-editing/history_parsing_toolz_2.c +++ b/42sh/src/line-editing/history_parsing_toolz_2.c @@ -6,13 +6,13 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/25 20:04:16 by gwojda #+# #+# */ -/* Updated: 2017/01/25 20:06:09 by gwojda ### ########.fr */ +/* Updated: 2017/01/26 11:33:22 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static char *ft_strget_history(char *str) +char *ft_strget_history(char *str) { t_list_history *list; size_t i; diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index af9225b3..154089c8 100644 --- a/42sh/src/line-editing/readline.c +++ b/42sh/src/line-editing/readline.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 14:19:48 by gwojda #+# #+# */ -/* Updated: 2017/01/25 17:06:53 by gwojda ### ########.fr */ +/* Updated: 2017/01/26 13:38:29 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -72,13 +72,15 @@ int ft_readline(void) data_singleton()->line.input = NULL; ft_prompt(); data_singleton()->line.input = ft_lecture(data_singleton()->line.list_beg); - ft_putstr("\n"); - ft_check_quotes(&data_singleton()->line.input, data_singleton()->line.list_beg); + ft_putchar('\n'); + ft_check_quotes(&data_singleton()->line.input, + data_singleton()->line.list_beg); ft_check_heredoc(&data_singleton()->line.input); - ft_history_builtin(); + ft_check_backslash(&data_singleton()->line.input); ft_history_parsing(); if (data_singleton()->line.input) - ft_push_back_history(&data_singleton()->line.list_beg, ft_create_history_list(data_singleton()->line.input)); + ft_push_back_history(&data_singleton()->line.list_beg, + ft_create_history_list(data_singleton()->line.input)); if (tcsetattr(0, TCSANOW, ft_save_stats_term()) == -1) return (-1); return (0); diff --git a/42sh/src/line-editing/surch_in_history.c b/42sh/src/line-editing/surch_in_history.c new file mode 100644 index 00000000..6630548b --- /dev/null +++ b/42sh/src/line-editing/surch_in_history.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* surch_in_history.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: gwojda +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/26 10:43:16 by gwojda #+# #+# */ +/* Updated: 2017/01/26 14:01:53 by gwojda ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void ft_clear_prompt(char *str, size_t *pos, size_t srch_pos) +{ + if (str) + ft_get_beggin_with_curs(str, pos); + else if (*pos) + { + ft_putnc('\b', *pos); + (*pos) = 0; + } + ft_putnc('\b', data_singleton()->line.prompt_size + srch_pos + 1); + ft_puttermcaps("cd"); +} + +void ft_surch_and_realloc(char **str, char **str_srch, int ret, size_t *srch_pos) +{ + *str_srch = ft_realloc_imput(*str_srch, ret, *srch_pos); + ++(*srch_pos); + *str = ft_strget_history(*str_srch); +} + +void ft_surch_in_history(char **str, size_t *pos) +{ + char *str_srch; + int ret; + size_t srch_pos; + + srch_pos = 0; + str_srch = NULL; + if (*str) + ft_strdel(str); + while (42) + { + ft_clear_prompt(*str, pos, srch_pos); + data_singleton()->line.prompt_size = 21; + if (str_srch) + ft_printf("\033[35m(reverse-i-search)`\033[32m%s\033[35m': \033[37m", str_srch); + else + ft_putstr("\033[35m(reverse-i-search)`': \033[37m"); + if (*str) + { + ft_current_str(*str, *pos); + ft_get_next_str(*str, pos); + } + ret = 0; + read(0, &ret, sizeof(int)); + if (ft_isprint(ret)) + ft_surch_and_realloc(str, &str_srch, ret, &srch_pos); + else if (ret == 127) + { + if (srch_pos) + { + --srch_pos; + str_srch = ft_remove_imput(str_srch, srch_pos); + ft_puttermcaps("le"); + } + } + else + break ; + } + ft_clear_prompt(*str, pos, srch_pos); + ft_prompt(); + if (*str) + { + *str = ft_strdup(*str); + ft_current_str(*str, *pos); + ft_get_next_str(*str, pos); + } + free(str_srch); +}