From 86fc221cb4684a802c904b98b659fb2badcb6620 Mon Sep 17 00:00:00 2001 From: gwojda Date: Fri, 3 Feb 2017 18:38:22 +0100 Subject: [PATCH] heredoc - historique avec point d'exclamation - sortie plus propre avec control D - historique ne prend plus en compte deux commandes consecutives egales --- 42sh/includes/ft_readline.h | 14 +++++++------- 42sh/src/line-editing/control_c_and_d.c | 5 ++++- 42sh/src/line-editing/get_touch.c | 2 +- 42sh/src/line-editing/heredoc.c | 5 ++++- 42sh/src/line-editing/history_parsing.c | 16 +++++++++++----- 42sh/src/line-editing/history_parsing_toolz.c | 3 +-- 42sh/src/line-editing/reader.c | 12 ++++++++---- 42sh/src/line-editing/readline.c | 5 +++-- 42sh/src/line-editing/tool_line.c | 3 ++- 9 files changed, 41 insertions(+), 24 deletions(-) diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index b559a11a..5a39f39c 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/02/03 16:27:48 by jhalford ### ########.fr */ +/* Updated: 2017/02/03 16:36:20 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -66,12 +66,12 @@ # define SIZE_PROMPT_BRACKET 7 # define SIZE_PROMPT_BSLASH 2 -# define IS_QUOTES 1 << 0 -# define IS_BQUOTES 1 << 1 -# define IS_DQUOTES 1 << 2 -# define IS_ACCOLADE 1 << 3 -# define IS_BRACKET 1 << 4 -# define IS_BSLASH 1 << 5 +# define IS_QUOTES (1 << 0) +# define IS_BQUOTES (1 << 1) +# define IS_DQUOTES (1 << 2) +# define IS_ACCOLADE (1 << 3) +# define IS_BRACKET (1 << 4) +# define IS_BSLASH (1 << 5) # define HIST 1 diff --git a/42sh/src/line-editing/control_c_and_d.c b/42sh/src/line-editing/control_c_and_d.c index a194e7a0..7a1396bc 100644 --- a/42sh/src/line-editing/control_c_and_d.c +++ b/42sh/src/line-editing/control_c_and_d.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/02 15:17:28 by gwojda #+# #+# */ -/* Updated: 2017/02/02 16:43:15 by gwojda ### ########.fr */ +/* Updated: 2017/02/03 18:27:23 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,10 @@ void ft_control_d(void) str = &data_singleton()->line.input; pos = &data_singleton()->line.pos; if (!(*str) || (*str)[0] == '\0') + { + ft_putstr("exit\n"); builtin_exit(NULL, (char*[]){"exit", NULL}, NULL); + } else if (*pos < ft_strlen(*str)) ft_del(); else diff --git a/42sh/src/line-editing/get_touch.c b/42sh/src/line-editing/get_touch.c index b4ff5b06..77f5989b 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/02/03 15:24:37 by gwojda ### ########.fr */ +/* Updated: 2017/02/03 18:00:09 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/heredoc.c b/42sh/src/line-editing/heredoc.c index 7637dcbd..36dd099a 100644 --- a/42sh/src/line-editing/heredoc.c +++ b/42sh/src/line-editing/heredoc.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/24 15:52:34 by gwojda #+# #+# */ -/* Updated: 2017/02/02 16:09:42 by gwojda ### ########.fr */ +/* Updated: 2017/02/03 18:15:07 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,6 +41,8 @@ static void ft_check_heredoc_2(char **str, char *end) *str = ft_strjoin(*str, "\n"); free(tmp); tmp = *str; + data_singleton()->line.input = NULL; + data_singleton()->line.pos = 0; tmp2 = ft_read_stdin(); if (!ft_strcmp(end, tmp2)) boolean = 1; @@ -74,4 +76,5 @@ void ft_check_heredoc(char **str) if (!end) return ; ft_check_heredoc_2(str, end); + free(end); } diff --git a/42sh/src/line-editing/history_parsing.c b/42sh/src/line-editing/history_parsing.c index 1da1f4dd..4ec1464f 100644 --- a/42sh/src/line-editing/history_parsing.c +++ b/42sh/src/line-editing/history_parsing.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/25 11:39:47 by gwojda #+# #+# */ -/* Updated: 2017/02/03 11:57:07 by gwojda ### ########.fr */ +/* Updated: 2017/02/03 17:57:21 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ static int ft_history_parsing_4(char *str, int *i) { + int tmp; if (!ft_strncmp("!!", str + *i, 2)) { ft_realloc_str_history(&(data_singleton()->line.input), *i, 0, 2); @@ -22,9 +23,10 @@ static int ft_history_parsing_4(char *str, int *i) } else if (ft_isdigit(str[(*i) + 1])) { + tmp = ft_nbr_len(ft_atoi(str + *i + 1)); ft_realloc_str_history(&(data_singleton()->line.input), *i, ft_atoi(str + (*i) + 1), ft_nbr_len(ft_atoi(str + *i + 1)) + 1); - (*i) += ft_nbr_len(ft_atoi(str + *i + 1)); + (*i) += tmp; return (1); } return (0); @@ -32,14 +34,16 @@ static int ft_history_parsing_4(char *str, int *i) static int ft_history_parsing_3(char *str, int *i) { + int tmp; if (ft_history_parsing_4(str, i)) return (1); - else if (str[*i + 1] == '-') + else if (str[*i + 1] == '-' && ft_isdigit(str[*i + 2])) { + tmp = ft_nbr_len(ft_atoi(str + *i + 2)); ft_realloc_str_history(&(data_singleton()->line.input), *i, data_singleton()->line.list_size - ft_atoi(str + *i + 2), ft_nbr_len(ft_atoi(str + *i + 2)) + 2); - (*i) += ft_nbr_len(ft_atoi(str + *i + 2) + 1); + i += tmp; } else if (str[*i + 1] == '?') ft_realloc_str_history_3(&(data_singleton()->line.input), *i, @@ -54,6 +58,7 @@ static int ft_history_parsing_3(char *str, int *i) static void ft_history_parsing_2(void) { + data_singleton()->line.pos = 0; data_singleton()->line.opt = data_singleton()->line.opt | HIST; ft_prompt(); data_singleton()->line.input = ft_read_stdin(); @@ -74,7 +79,7 @@ void ft_history_parsing(void) str = data_singleton()->line.input; if (!str) return ; - while (str[i]) + while (str && str[i]) { if (str[i] == '!') { @@ -82,6 +87,7 @@ void ft_history_parsing(void) if (!ft_history_parsing_3(str, &i)) boolean = 0; } + str = data_singleton()->line.input; ++i; } if (boolean) diff --git a/42sh/src/line-editing/history_parsing_toolz.c b/42sh/src/line-editing/history_parsing_toolz.c index 31a4b818..3017d4ec 100644 --- a/42sh/src/line-editing/history_parsing_toolz.c +++ b/42sh/src/line-editing/history_parsing_toolz.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/25 14:09:39 by gwojda #+# #+# */ -/* Updated: 2017/01/25 14:41:29 by gwojda ### ########.fr */ +/* Updated: 2017/02/03 17:03:23 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,6 @@ void ft_realloc_str_history(char **str, size_t pos, int nb_his, int len) if (!*str) return ; new_str = ft_strndup(*str, pos); - ft_printf("\n\npos = %d\n\n", len); new_str3 = ft_nget_histo(nb_his); if (new_str3) { diff --git a/42sh/src/line-editing/reader.c b/42sh/src/line-editing/reader.c index 22d41fd2..70e53052 100644 --- a/42sh/src/line-editing/reader.c +++ b/42sh/src/line-editing/reader.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/19 16:52:57 by gwojda #+# #+# */ -/* Updated: 2017/02/03 11:40:10 by gwojda ### ########.fr */ +/* Updated: 2017/02/03 18:24:47 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -52,8 +52,10 @@ void ft_read_it(int input, size_t *pos, char **str) { int j; char t[5]; + size_t pos_tmp; j = 0; + pos_tmp = *pos; if (input == TOUCHE_DELETE || input < 0 || input == 892427035 || input == 126 || input == 993090331 || input == 925981467 || input == 21298 || input == 892427035 || input == 8270395 || @@ -61,7 +63,9 @@ void ft_read_it(int input, size_t *pos, char **str) return ; ft_read_it_2(input, t); ft_read_it_3(str, t, pos, &j); -// ft_current_str((*str) + (*pos) - j, *pos); -// ft_get_next_str((*str) + (*pos) - j, pos); - ft_putnc('\b', ft_strlen((*str)) - ((*pos))); + *pos = pos_tmp; + ft_current_str((*str), *pos); + ft_get_next_str((*str), pos); + ft_putnc('\b', *pos - (pos_tmp + j) + 1); + *pos = (pos_tmp + j); } diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index fd947591..61445543 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/02/03 16:23:38 by jhalford ### ########.fr */ +/* Updated: 2017/02/03 18:36:18 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -86,7 +86,8 @@ int ft_readline(void) ft_putchar('\n'); ft_check_heredoc(&data_singleton()->line.input); ft_history_parsing(); - if (data_singleton()->line.input) + if (data_singleton()->line.input && (!data_singleton()->line.list_beg || + ft_strcmp(data_singleton()->line.list_beg->prev->str, data_singleton()->line.input))) { ft_push_back_history(&data_singleton()->line.list_beg, ft_create_history_list(data_singleton()->line.input)); diff --git a/42sh/src/line-editing/tool_line.c b/42sh/src/line-editing/tool_line.c index 0745579b..4047df37 100644 --- a/42sh/src/line-editing/tool_line.c +++ b/42sh/src/line-editing/tool_line.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/20 18:20:23 by gwojda #+# #+# */ -/* Updated: 2017/02/01 15:27:31 by gwojda ### ########.fr */ +/* Updated: 2017/02/03 17:50:48 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,6 +37,7 @@ void ft_putall_current_str(char *str, size_t *pos) while (str[(*pos) + len] && str[(*pos) + len] != '\n') ++len; write(1, str + *pos, len); + ft_check_end_of_line(str, *pos + len); } void ft_current_str(char *str, size_t pos)