diff --git a/42sh/src/line-editing/rl_copy_function.c b/42sh/OLD/OLD_RL/rl_copy_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_copy_function.c rename to 42sh/OLD/OLD_RL/rl_copy_function.c.old diff --git a/42sh/src/line-editing/rl_cut_function.c b/42sh/OLD/OLD_RL/rl_cut_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_cut_function.c rename to 42sh/OLD/OLD_RL/rl_cut_function.c.old diff --git a/42sh/src/line-editing/rl_dquote_function.c b/42sh/OLD/OLD_RL/rl_dquote_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_dquote_function.c rename to 42sh/OLD/OLD_RL/rl_dquote_function.c.old diff --git a/42sh/src/line-editing/rl_end_function.c b/42sh/OLD/OLD_RL/rl_end_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_end_function.c rename to 42sh/OLD/OLD_RL/rl_end_function.c.old diff --git a/42sh/src/line-editing/rl_esc_function.c b/42sh/OLD/OLD_RL/rl_esc_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_esc_function.c rename to 42sh/OLD/OLD_RL/rl_esc_function.c.old diff --git a/42sh/src/line-editing/rl_home_function.c b/42sh/OLD/OLD_RL/rl_home_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_home_function.c rename to 42sh/OLD/OLD_RL/rl_home_function.c.old diff --git a/42sh/src/line-editing/rl_insert_function.c b/42sh/OLD/OLD_RL/rl_insert_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_insert_function.c rename to 42sh/OLD/OLD_RL/rl_insert_function.c.old diff --git a/42sh/src/line-editing/rl_left_function.c b/42sh/OLD/OLD_RL/rl_left_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_left_function.c rename to 42sh/OLD/OLD_RL/rl_left_function.c.old diff --git a/42sh/src/line-editing/rl_nl_function.c b/42sh/OLD/OLD_RL/rl_nl_function.c.old similarity index 94% rename from 42sh/src/line-editing/rl_nl_function.c rename to 42sh/OLD/OLD_RL/rl_nl_function.c.old index 9b57334c..8e212af2 100644 --- a/42sh/src/line-editing/rl_nl_function.c +++ b/42sh/OLD/OLD_RL/rl_nl_function.c.old @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 19:03:22 by sbenning #+# #+# */ -/* Updated: 2016/12/10 12:06:41 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 12:09:12 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,9 +16,9 @@ int rl_nl_function(t_line *line, long int input) { if (RL_IS(line->bitset, RL_SELECT)) RL_UNSET(line->bitset, RL_SELECT); + RL_SET(line->bitset, RL_STACK); if (RL_NOT(line->bitset, RL_QUOTING)) RL_SET(line->bitset, RL_FINISH); - RL_SET(line->bitset, RL_STACK); return (0); (void)input; } diff --git a/42sh/src/line-editing/rl_pagedown_function.c b/42sh/OLD/OLD_RL/rl_pagedown_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_pagedown_function.c rename to 42sh/OLD/OLD_RL/rl_pagedown_function.c.old diff --git a/42sh/src/line-editing/rl_pageup_function.c b/42sh/OLD/OLD_RL/rl_pageup_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_pageup_function.c rename to 42sh/OLD/OLD_RL/rl_pageup_function.c.old diff --git a/42sh/src/line-editing/rl_paste_function.c b/42sh/OLD/OLD_RL/rl_paste_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_paste_function.c rename to 42sh/OLD/OLD_RL/rl_paste_function.c.old diff --git a/42sh/src/line-editing/rl_quote_function.c b/42sh/OLD/OLD_RL/rl_quote_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_quote_function.c rename to 42sh/OLD/OLD_RL/rl_quote_function.c.old diff --git a/42sh/src/line-editing/rl_retarr_function.c b/42sh/OLD/OLD_RL/rl_retarr_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_retarr_function.c rename to 42sh/OLD/OLD_RL/rl_retarr_function.c.old diff --git a/42sh/src/line-editing/rl_right_function.c b/42sh/OLD/OLD_RL/rl_right_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_right_function.c rename to 42sh/OLD/OLD_RL/rl_right_function.c.old diff --git a/42sh/src/line-editing/rl_select_end_function.c b/42sh/OLD/OLD_RL/rl_select_end_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_end_function.c rename to 42sh/OLD/OLD_RL/rl_select_end_function.c.old diff --git a/42sh/src/line-editing/rl_select_home_function.c b/42sh/OLD/OLD_RL/rl_select_home_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_home_function.c rename to 42sh/OLD/OLD_RL/rl_select_home_function.c.old diff --git a/42sh/src/line-editing/rl_select_left_function.c b/42sh/OLD/OLD_RL/rl_select_left_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_left_function.c rename to 42sh/OLD/OLD_RL/rl_select_left_function.c.old diff --git a/42sh/src/line-editing/rl_select_pagedown_function.c b/42sh/OLD/OLD_RL/rl_select_pagedown_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_pagedown_function.c rename to 42sh/OLD/OLD_RL/rl_select_pagedown_function.c.old diff --git a/42sh/src/line-editing/rl_select_pageup_function.c b/42sh/OLD/OLD_RL/rl_select_pageup_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_pageup_function.c rename to 42sh/OLD/OLD_RL/rl_select_pageup_function.c.old diff --git a/42sh/src/line-editing/rl_select_right_function.c b/42sh/OLD/OLD_RL/rl_select_right_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_right_function.c rename to 42sh/OLD/OLD_RL/rl_select_right_function.c.old diff --git a/42sh/src/line-editing/rl_select_wleft_function.c b/42sh/OLD/OLD_RL/rl_select_wleft_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_wleft_function.c rename to 42sh/OLD/OLD_RL/rl_select_wleft_function.c.old diff --git a/42sh/src/line-editing/rl_select_wright_function.c b/42sh/OLD/OLD_RL/rl_select_wright_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_select_wright_function.c rename to 42sh/OLD/OLD_RL/rl_select_wright_function.c.old diff --git a/42sh/src/line-editing/rl_suppr_function.c b/42sh/OLD/OLD_RL/rl_suppr_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_suppr_function.c rename to 42sh/OLD/OLD_RL/rl_suppr_function.c.old diff --git a/42sh/src/line-editing/rl_wleft_function.c b/42sh/OLD/OLD_RL/rl_wleft_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_wleft_function.c rename to 42sh/OLD/OLD_RL/rl_wleft_function.c.old diff --git a/42sh/src/line-editing/rl_wright_function.c b/42sh/OLD/OLD_RL/rl_wright_function.c.old similarity index 100% rename from 42sh/src/line-editing/rl_wright_function.c rename to 42sh/OLD/OLD_RL/rl_wright_function.c.old diff --git a/42sh/includes/ft_input.h b/42sh/includes/ft_input.h index c241eb3c..fae57b62 100644 --- a/42sh/includes/ft_input.h +++ b/42sh/includes/ft_input.h @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/09 02:05:22 by sbenning #+# #+# */ -/* Updated: 2016/12/10 10:42:43 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 10:48:33 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ # define RL_INSERT_CODE 0x7e325b1b # define RL_CLEAR_CODE 0xc # define RL_NL_CODE 0xa +# define RL_COMP_CODE 0x9 # define RL_LEFT_CODE 0x445b1b # define RL_RIGHT_CODE 0x435b1b # define RL_WLEFT_CODE 0x44323b315b1b @@ -52,6 +53,7 @@ # define RL_INSERT_CODE 0x53323b315b1b # define RL_CLEAR_CODE 0xc # define RL_NL_CODE 0xa +# define RL_COMP_CODE 0x9 # define RL_LEFT_CODE 0x445b1b # define RL_RIGHT_CODE 0x435b1b # define RL_WLEFT_CODE 0x44323b315b1b diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index f50d785c..8494e3b1 100644 --- a/42sh/includes/ft_readline.h +++ b/42sh/includes/ft_readline.h @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:02:25 by sbenning #+# #+# */ -/* Updated: 2016/12/10 12:20:20 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 12:50:39 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,6 +30,15 @@ # define RL_OFFSET 1024 +/* + * Readline possible prompt +*/ + +# define RL_PROMPT_DEFAULT "$> " +# define RL_PROMPT_ESC "> " +# define RL_PROMPT_QUOTE "quote> " +# define RL_PROMPT_DQUOTE "double quote> " + /* * Bitset manipulation : X is the bitset and Y is the bit to manipulate * IS : Is Y set in X @@ -65,6 +74,7 @@ # define RL_DQUOTE 0x40 # define RL_QUOTING (RL_ESC|RL_QUOTE|RL_DQUOTE) +typedef struct s_data t_data; typedef struct s_line t_line; typedef struct s_input t_input; typedef int (*t_input_function)(t_line *, long int); @@ -112,6 +122,8 @@ struct s_input t_input_function function; }; +# include "minishell.h" + /* * Readline setup/cleanup/teardown */ @@ -132,9 +144,14 @@ void input_remove(t_line *line, int size); * Readline internal function */ +void rl_set_prompt(t_line *line); void rl_put_prompt(t_line *line); +int rl_previous_word(t_line *line); +int rl_next_word(t_line *line); int rl_clipboard_new(t_line *line); int rl_clipboard_new_cut(t_line *line); +void rl_toogle_bitset(t_line *line, int set); +int rl_finish(t_line *line); int rl_stack_line(t_line *line); int rl_merge_line(t_line *line); @@ -168,6 +185,7 @@ int rl_esc_function(t_line *line, long int input); /* Backslash */ int rl_quote_function(t_line *line, long int input); /* Simple quote */ int rl_dquote_function(t_line *line, long int input); /* Double quote */ int rl_nl_function(t_line *line, long int input); /* New line */ +int rl_comp_function(t_line *line, long int input); /* New line */ int rl_left_function(t_line *line, long int input); /* Left move */ int rl_right_function(t_line *line, long int input); /* Right move */ int rl_wleft_function(t_line *line, long int input); /* Word left move */ diff --git a/42sh/src/line-editing/interactive_sh.c b/42sh/src/line-editing/ft_interactive_sh.c similarity index 100% rename from 42sh/src/line-editing/interactive_sh.c rename to 42sh/src/line-editing/ft_interactive_sh.c diff --git a/42sh/src/line-editing/ft_readline.c b/42sh/src/line-editing/ft_readline.c index b7483ed9..6c477610 100644 --- a/42sh/src/line-editing/ft_readline.c +++ b/42sh/src/line-editing/ft_readline.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:03:48 by sbenning #+# #+# */ -/* Updated: 2016/12/10 11:50:51 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 10:48:50 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ static t_input g_input[] = {\ {RL_NL_CODE, rl_nl_function},\ + {RL_COMP_CODE, rl_comp_function},\ {RL_INSERT_CODE, rl_insert_function},\ {RL_CLEAR_CODE, rl_clear_function},\ {RL_RETARR_CODE, rl_retarr_function},\ @@ -43,50 +44,6 @@ static t_input g_input[] = {\ {0x0, rl_default_function}\ }; -static void rl_toogle_bitset(t_line *line, int set) -{ - static int esc; - static int select; - - if (!set) - { - esc = RL_IS(line->bitset, RL_ESC); - select = RL_IS(line->bitset, RL_SELECT); - } - else - { - if (esc) - { - RL_UNSET(line->bitset, RL_ESC); - esc = 0; - } - if ((select && RL_NOT(line->bitset, RL_SELECT)) || (!select && RL_IS(line->bitset, RL_SELECT))) - { - rl_reset_display(line); - } - } -} - -static int rl_finish(t_line *line) -{ - if (RL_IS(line->bitset, RL_STACK)) - { - rl_end_function(line, 0); - write(1, "\n", 1); - if (rl_stack_line(line) < 0) - return (-1); - if (RL_NOT(line->bitset, RL_FINISH)) - { - if (curs_coo_setup(&line->curs) < 0) - return (-1); - line->prompt = (RL_IS(line->bitset, RL_ESC) ? "> " : "quote> "); - rl_put_prompt(line); - } - RL_UNSET(line->bitset, RL_STACK); - } - return (RL_IS(line->bitset, RL_FINISH)); -} - static t_input_function rl_get_function(long int input) { int i; diff --git a/42sh/src/line-editing/rl_bitset.c b/42sh/src/line-editing/rl_bitset.c new file mode 100644 index 00000000..9b352b89 --- /dev/null +++ b/42sh/src/line-editing/rl_bitset.c @@ -0,0 +1,72 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_bitset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 10:31:34 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:24:16 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +static void rl_toogle_esc(t_line *line, int set) +{ + static int esc; + + if (!set) + esc = RL_IS(line->bitset, RL_ESC); + else if (set && esc) + { + RL_UNSET(line->bitset, RL_ESC); + esc = 0; + } +} + +static void rl_toogle_select(t_line *line, int set) +{ + static int select; + + if (!set) + select = RL_IS(line->bitset, RL_SELECT); + else if (set &&\ + ((select && RL_NOT(line->bitset, RL_SELECT)) ||\ + (!select && RL_IS(line->bitset, RL_SELECT)))) + rl_reset_display(line); +} + +void rl_toogle_bitset(t_line *line, int set) +{ + rl_toogle_esc(line, set); + rl_toogle_select(line, set); +} + +int rl_finish(t_line *line) +{ + int finish; + int stack; + + stack = RL_IS(line->bitset, RL_STACK); + finish = RL_IS(line->bitset, RL_FINISH); + if (!stack && !finish) + return (0); + rl_end_function(line, 0); + write(1, "\n", 1); + if (stack) + { + RL_UNSET(line->bitset, RL_STACK); + if (rl_stack_line(line) < 0) + return (-1); + } + if (finish) + return (1); + if (curs_coo_setup(&line->curs) < 0) + return (-1); + line->prompt = (RL_IS(line->bitset, RL_ESC) ? "> " : "quote> "); + rl_set_prompt(line); + rl_put_prompt(line); + return (0); +} + diff --git a/42sh/src/line-editing/rl_clipboard_function.c b/42sh/src/line-editing/rl_clipboard_function.c new file mode 100644 index 00000000..5b884d97 --- /dev/null +++ b/42sh/src/line-editing/rl_clipboard_function.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_clipboard_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:32:11 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:34:12 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_copy_function(t_line *line, long int input) +{ + if (line->clipboard) + ft_memdel((void **)&line->clipboard); + if (rl_clipboard_new(line) < 0) + return (-1); + return (0); + (void)input; +} + +int rl_cut_function(t_line *line, long int input) +{ + if (line->clipboard) + ft_memdel((void **)&line->clipboard); + if (rl_clipboard_new_cut(line) < 0) + return (-1); + rl_reset_display_post(line); + return (0); + (void)input; +} + +int rl_paste_function(t_line *line, long int input) +{ + int len; + + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (!line->clipboard) + return (0); + len = ft_strlen(line->clipboard); + if (!len) + return (0); + if (RL_IS(line->bitset, RL_INSERT)) + { + if (input_move(line, line->clipboard, len) < 0) + return (-1); + } + else + { + if (input_maj(line, line->clipboard, len) < 0) + return (-1); + } + rl_reset_display_post(line); + curs_forward(&line->curs, len); + line->pos += len; + return (0); + (void)input; +} diff --git a/42sh/src/line-editing/rl_clipboard.c b/42sh/src/line-editing/rl_clipboard_utility.c similarity index 100% rename from 42sh/src/line-editing/rl_clipboard.c rename to 42sh/src/line-editing/rl_clipboard_utility.c diff --git a/42sh/src/line-editing/rl_comp_function.c b/42sh/src/line-editing/rl_comp_function.c new file mode 100644 index 00000000..74ca7715 --- /dev/null +++ b/42sh/src/line-editing/rl_comp_function.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_comp_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 10:49:03 by sbenning #+# #+# */ +/* Updated: 2016/12/12 11:01:45 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +static int ft_autocomp(t_data *data) +{ + return (0); + int li; + int co; + + li = data->line.curs.li; + co = data->line.curs.co; + ft_putstr("\nTeeeeeeest"); + data->line.input = ft_strjoin(data->line.input, " JOIN "); + curs_goto(&data->line.curs, li, co + 6); + return (0); +} + +int rl_comp_function(t_line *line, long int input) +{ + t_data *data; + + data = *data_singleton(); + if (ft_autocomp(data) < 0) + return (-1); + line->size = ft_strlen(line->input); + line->used = line->size; + curs_reset(0); + return (0); +} diff --git a/42sh/src/line-editing/rl_default_function.c b/42sh/src/line-editing/rl_default_function.c index 41b11d27..5c953981 100644 --- a/42sh/src/line-editing/rl_default_function.c +++ b/42sh/src/line-editing/rl_default_function.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:30:38 by sbenning #+# #+# */ -/* Updated: 2016/12/09 12:04:50 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 11:50:26 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,8 +28,11 @@ int rl_default_function(t_line *line, long int input) if (input_maj(line, (char *)&input, sizeof(char)) < 0) return (-1); } - curs_write(&line->curs, (char *)&input, sizeof(char)); + rl_reset_display_post(line); + curs_forward(&line->curs, sizeof(char)); + line->pos += 1; +/* curs_write(&line->curs, (char *)&input, sizeof(char)); line->pos += 1; rl_reset_display_post(line); - return (0); +*/ return (0); } diff --git a/42sh/src/line-editing/input_buffer.c b/42sh/src/line-editing/rl_dynamic_buffer.c similarity index 74% rename from 42sh/src/line-editing/input_buffer.c rename to 42sh/src/line-editing/rl_dynamic_buffer.c index 6498cbc7..d6f1a673 100644 --- a/42sh/src/line-editing/input_buffer.c +++ b/42sh/src/line-editing/rl_dynamic_buffer.c @@ -6,18 +6,19 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:42:31 by sbenning #+# #+# */ -/* Updated: 2016/12/09 16:30:35 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 10:28:59 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_readline.h" + int input_extend(t_line *line, int size) { char *tmp; - size = (RL_OFFSET > size ? RL_OFFSET : size); - if ((tmp = ft_strnew(line->size + size)) == NULL) + size = (RL_OFFSET > size ? RL_OFFSET : size) + line->size; + if ((tmp = ft_strnew(size)) == NULL) return (-1); if (line->input) { @@ -25,15 +26,20 @@ int input_extend(t_line *line, int size) free(line->input); } line->input = tmp; - line->size += size; + line->size = size; return (0); } +int rl_dynamic_buffer_extend(t_line *line, int size) +{ + return (input_extend(line, size)); +} + int input_maj(t_line *line, char *str, int size) { if (line->used + size >= line->size) { - if (input_extend(line, size) < 0) + if (rl_dynamic_buffer_extend(line, size) < 0) return (-1); } ft_memcpy(line->input + line->pos, str, size); @@ -48,7 +54,7 @@ int input_move(t_line *line, char *str, int size) if (line->used + size >= line->size) { - if (input_extend(line, size) < 0) + if (rl_dynamic_buffer_extend(line, size) < 0) return (-1); } if ((dup = ft_strdup(line->input + line->pos)) == NULL) @@ -75,3 +81,19 @@ void input_remove(t_line *line, int size) line->used -= size; ft_bzero(line->input + line->used, line->size - line->used); } + + +int rl_dynamic_buffer_replace(t_line *line, char *str, int size) +{ + return (input_maj(line, str, size)); +} + +int rl_dynamic_buffer_insert(t_line *line, char *str, int size) +{ + return (input_move(line, str, size)); +} + +void rl_dynamic_buffer_remove(t_line *line, int size) +{ + input_remove(line, size); +} diff --git a/42sh/src/line-editing/rl_long_move_function.c b/42sh/src/line-editing/rl_long_move_function.c new file mode 100644 index 00000000..5769b90e --- /dev/null +++ b/42sh/src/line-editing/rl_long_move_function.c @@ -0,0 +1,65 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_long_move_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:55:48 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:57:16 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_home_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (!line->pos) + return (0); + curs_backward(&line->curs, line->pos); + line->pos = 0; + return (0); + (void)input; +} + +int rl_end_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (line->pos == line->used) + return (0); + curs_forward(&line->curs, line->used - line->pos); + line->pos = line->used; + return (0); + (void)input; +} + +int rl_select_home_function(t_line *line, long int input) +{ + int ret; + + if (!line->pos) + return (0); + if (RL_NOT(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_home_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_post(line); + return (ret); +} + +int rl_select_end_function(t_line *line, long int input) +{ + int ret; + + if (line->pos == line->used) + return (0); + if (RL_NOT(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_end_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_ante(line); + return (ret); +} diff --git a/42sh/src/line-editing/rl_merge_line.c b/42sh/src/line-editing/rl_merge_line.c index 38a7f490..ed0b0ea3 100644 --- a/42sh/src/line-editing/rl_merge_line.c +++ b/42sh/src/line-editing/rl_merge_line.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/09 01:25:03 by sbenning #+# #+# */ -/* Updated: 2016/12/09 01:58:15 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 11:34:02 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,17 +22,17 @@ int rl_merge_line(t_line *line) { next = line->stack->next; chunk = (char *)line->stack->content; - size = line->stack->content_size; + size = line->stack->content_size - 1; if (input_maj(line, chunk, size) < 0) return (-1); line->pos += size; - if (next) + /* if (next) { if (input_maj(line, "\n", 1) < 0) return (-1); line->pos += 1; } - free(chunk); + */ free(chunk); free(line->stack); line->stack = next; } diff --git a/42sh/src/line-editing/rl_page_move_function.c b/42sh/src/line-editing/rl_page_move_function.c new file mode 100644 index 00000000..efd20d87 --- /dev/null +++ b/42sh/src/line-editing/rl_page_move_function.c @@ -0,0 +1,72 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_page_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:39:57 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:42:37 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_pagedown_function(t_line *line, long int input) +{ + int len; + + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (line->pos == line->used) + return (0); + len = line->used - line->pos; + len = (line->curs.win_co > len ? len : line->curs.win_co); + curs_forward(&line->curs, len); + line->pos += len; + return (0); + (void)input; +} + +int rl_pageup_function(t_line *line, long int input) +{ + int len; + + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (!line->pos) + return (0); + len = (line->curs.win_co > line->pos ? line->pos : line->curs.win_co); + curs_backward(&line->curs, len); + line->pos -= len; + return (0); + (void)input; +} + +int rl_select_pagedown_function(t_line *line, long int input) +{ + int ret; + + if (line->pos == line->used) + return (0); + if (RL_NOT(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_pagedown_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_ante(line); + return (ret); +} + +int rl_select_pageup_function(t_line *line, long int input) +{ + int ret; + + if (!line->pos) + return (0); + if (RL_NOT(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_pageup_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_post(line); + return (ret); +} diff --git a/42sh/src/line-editing/rl_prompt.c b/42sh/src/line-editing/rl_prompt.c index baff188c..625cd9a5 100644 --- a/42sh/src/line-editing/rl_prompt.c +++ b/42sh/src/line-editing/rl_prompt.c @@ -6,12 +6,24 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/09 01:45:09 by sbenning #+# #+# */ -/* Updated: 2016/12/09 13:38:07 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 12:20:55 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_readline.h" +void rl_set_prompt(t_line *line) +{ + if (RL_IS(line->bitset, RL_ESC)) + line->prompt = RL_PROMPT_ESC; + else if (RL_IS(line->bitset, RL_QUOTE)) + line->prompt = RL_PROMPT_QUOTE; + else if (RL_IS(line->bitset, RL_DQUOTE)) + line->prompt = RL_PROMPT_DQUOTE; + else + line->prompt = RL_PROMPT_DEFAULT; +} + void rl_put_prompt(t_line *line) { curs_write(&line->curs, line->prompt, ft_strlen(line->prompt)); diff --git a/42sh/src/line-editing/rl_quoting_function.c b/42sh/src/line-editing/rl_quoting_function.c new file mode 100644 index 00000000..57ce891e --- /dev/null +++ b/42sh/src/line-editing/rl_quoting_function.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_quoting_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:35:25 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:36:41 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_esc_function(t_line *line, long int input) +{ + if (RL_NOT(line->bitset, RL_ESC)) + RL_SET(line->bitset, RL_ESC); + return (rl_default_function(line, input)); +} + +int rl_quote_function(t_line *line, long int input) +{ + if (RL_NOT(line->bitset, RL_ESC)) + { + if (RL_IS(line->bitset, RL_QUOTE)) + RL_UNSET(line->bitset, RL_QUOTE); + else + RL_SET(line->bitset, RL_QUOTE); + } + return (rl_default_function(line, input)); +} + +int rl_dquote_function(t_line *line, long int input) +{ + if (RL_NOT(line->bitset, RL_ESC)) + { + if (RL_IS(line->bitset, RL_DQUOTE)) + RL_UNSET(line->bitset, RL_DQUOTE); + else + RL_SET(line->bitset, RL_DQUOTE); + } + return (rl_default_function(line, input)); +} diff --git a/42sh/src/line-editing/rl_remove_function.c b/42sh/src/line-editing/rl_remove_function.c new file mode 100644 index 00000000..feeab949 --- /dev/null +++ b/42sh/src/line-editing/rl_remove_function.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_remove_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:45:08 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:46:39 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_retarr_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (!line->pos) + return (0); + input_remove(line, 1); + curs_backward(&line->curs, 1); + line->pos -= 1; + rl_reset_display_post(line); + return (0); + (void)input; +} + +int rl_suppr_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (line->pos == line->used) + return (0); + input_remove(line, -1); + rl_reset_display_post(line); + return (0); + (void)input; +} diff --git a/42sh/src/line-editing/rl_setup.c b/42sh/src/line-editing/rl_setup.c index 5114c7e7..cbbeb3c6 100644 --- a/42sh/src/line-editing/rl_setup.c +++ b/42sh/src/line-editing/rl_setup.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/08 18:07:47 by sbenning #+# #+# */ -/* Updated: 2016/12/09 13:39:22 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 12:20:55 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,7 @@ int rl_setup(t_line *line) return (-1); RL_SET(line->bitset, RL_INSERT); line->prompt = "$> "; + rl_set_prompt(line); return (0); } diff --git a/42sh/src/line-editing/rl_short_move_function.c b/42sh/src/line-editing/rl_short_move_function.c new file mode 100644 index 00000000..8399cf19 --- /dev/null +++ b/42sh/src/line-editing/rl_short_move_function.c @@ -0,0 +1,65 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_move_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:53:18 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:54:52 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_left_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (!line->pos) + return (0); + curs_backward(&line->curs, 1); + line->pos -= 1; + return (0); + (void)input; +} + +int rl_right_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + if (line->pos == line->used) + return (0); + curs_forward(&line->curs, 1); + line->pos += 1; + return (0); + (void)input; +} + +int rl_select_left_function(t_line *line, long int input) +{ + int ret; + + if (!line->pos) + return (0); + if (RL_NOT(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_left_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_post(line); + return (ret); +} + +int rl_select_right_function(t_line *line, long int input) +{ + int ret; + + if (line->pos == line->used) + return (0); + if (!RL_IS(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_right_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_ante(line); + return (ret); +} diff --git a/42sh/src/line-editing/rl_stack_line.c b/42sh/src/line-editing/rl_stack_line.c index b632b99c..5c40ccb0 100644 --- a/42sh/src/line-editing/rl_stack_line.c +++ b/42sh/src/line-editing/rl_stack_line.c @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/09 01:06:54 by sbenning #+# #+# */ -/* Updated: 2016/12/10 09:54:10 by sbenning ### ########.fr */ +/* Updated: 2016/12/12 11:33:28 by sbenning ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,7 @@ int rl_stack_line(t_line *line) { t_list *elem; - elem = ft_lstnew(line->input, line->used); + elem = ft_lstnew(line->input, line->used + 1); if (elem == NULL) return (-1); ft_lsteadd(&line->stack, elem); @@ -24,5 +24,11 @@ int rl_stack_line(t_line *line) line->pos = 0; line->size = 0; line->used = 0; + if (RL_NOT(line->bitset, RL_ESC)) + return (0); + elem = ft_lstnew("\n", 2); + if (elem == NULL) + return (-1); + ft_lsteadd(&line->stack, elem); return (0); } diff --git a/42sh/src/line-editing/rl_state_function.c b/42sh/src/line-editing/rl_state_function.c new file mode 100644 index 00000000..200961d8 --- /dev/null +++ b/42sh/src/line-editing/rl_state_function.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_state_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 13:00:59 by sbenning #+# #+# */ +/* Updated: 2016/12/12 13:01:51 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_insert_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_INSERT)) + RL_UNSET(line->bitset, RL_INSERT); + else + RL_SET(line->bitset, RL_INSERT); + return (0); + (void)input; +} + +int rl_nl_function(t_line *line, long int input) +{ + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + RL_SET(line->bitset, RL_STACK); + if (RL_NOT(line->bitset, RL_QUOTING)) + RL_SET(line->bitset, RL_FINISH); + return (0); + (void)input; +} diff --git a/42sh/src/line-editing/rl_word_move_function.c b/42sh/src/line-editing/rl_word_move_function.c new file mode 100644 index 00000000..205d9046 --- /dev/null +++ b/42sh/src/line-editing/rl_word_move_function.c @@ -0,0 +1,67 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_word_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:47:31 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:51:53 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_wleft_function(t_line *line, long int input) +{ + size_t len; + + if (!line->pos) + return (0); + len = rl_previous_word(line); + curs_backward(&line->curs, len); + line->pos -= len; + return (0); + (void)input; +} + +int rl_wright_function(t_line *line, long int input) +{ + size_t len; + + if (line->pos == line->used) + return (0); + len = rl_next_word(line); + curs_forward(&line->curs, len); + line->pos += len; + return (0); + (void)input; +} + +int rl_select_wleft_function(t_line *line, long int input) +{ + int ret; + + if (!line->pos) + return (0); + if (RL_NOT(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_wleft_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_post(line); + return (ret); +} + +int rl_select_wright_function(t_line *line, long int input) +{ + int ret; + + if (line->pos == line->used) + return (0); + if (RL_NOT(line->bitset, RL_SELECT)) + line->select = line->pos; + ret = rl_wright_function(line, input); + RL_SET(line->bitset, RL_SELECT); + rl_reset_display_ante(line); + return (ret); +} diff --git a/42sh/src/line-editing/rl_word_utility.c b/42sh/src/line-editing/rl_word_utility.c new file mode 100644 index 00000000..46010b9f --- /dev/null +++ b/42sh/src/line-editing/rl_word_utility.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rl_word_utility.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/12 12:48:07 by sbenning #+# #+# */ +/* Updated: 2016/12/12 12:50:44 by sbenning ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_readline.h" + +int rl_previous_word(t_line *line) +{ + int i; + int len; + + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + i = 0; + while (line->input[i] && i < line->pos) + { + if (!i && line->input[i] != ' ') + len = i; + if (i && line->input[i - 1] == ' ' && line->input[i] != ' ') + len = i; + i++; + } + return (line->pos - len); +} + +int rl_next_word(t_line *line) +{ + int i; + int flag; + + if (RL_IS(line->bitset, RL_SELECT)) + RL_UNSET(line->bitset, RL_SELECT); + i = line->pos; + flag = 0; + while (line->input[i] && (line->input[i] == ' ' || !flag)) + { + if (line->input[i] == ' ') + flag = 1; + i++; + } + return (i - line->pos); +} +