From e8cd4f45b0a3bb16886187760e9f945cd26f3d5c Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Fri, 10 Feb 2017 00:38:45 +0100 Subject: [PATCH 01/10] started to work on lexer_stack --- 42sh/Makefile | 14 +- 42sh/includes/ft_readline.h | 28 ++-- 42sh/includes/lexer.h | 64 +++++---- 42sh/includes/line_editing.h | 89 ------------ 42sh/includes/lst.h | 80 ----------- 42sh/includes/minishell.h | 7 +- 42sh/includes/types.h | 6 +- 42sh/libft | 2 +- .../{get_lexer_state.c => get_state_global.c} | 29 ++-- .../lexer/{ft_lexer.c => get_state_redir.c} | 25 ++-- 42sh/src/lexer/lexer_backslash.c | 11 +- 42sh/src/lexer/lexer_bquote.c | 35 +++++ 42sh/src/lexer/lexer_comment.c | 10 +- 42sh/src/lexer/lexer_default.c | 32 +++-- 42sh/src/lexer/lexer_delim.c | 14 +- 42sh/src/lexer/lexer_dquote.c | 41 ++++-- 42sh/src/lexer/lexer_great.c | 26 ++-- 42sh/src/lexer/lexer_greatand.c | 22 +-- 42sh/src/lexer/lexer_less.c | 26 ++-- 42sh/src/lexer/lexer_lessand.c | 22 +-- 42sh/src/lexer/{ft_tokenize.c => lexer_lex.c} | 19 +-- 42sh/src/lexer/lexer_newline.c | 8 +- 42sh/src/lexer/lexer_number.c | 27 ++-- 42sh/src/lexer/lexer_quote.c | 22 ++- 42sh/src/lexer/lexer_sep.c | 28 ++-- .../{lexer_special.c => lexer_subshell.c} | 15 +- 42sh/src/lexer/lexer_word.c | 22 +-- 42sh/src/lexer/reduce_bquotes.c | 9 +- 42sh/src/lexer/stack_to_prompt.c | 34 +++++ 42sh/src/lexer/token_append.c | 6 +- 42sh/src/line-editing/check_backslash.c | 128 ------------------ .../src/line-editing/{prompt.c => ftprompt.c} | 6 +- 42sh/src/line-editing/get_touch.c | 6 +- 42sh/src/line-editing/history.c | 2 +- 42sh/src/line-editing/history_parsing.c | 12 +- 42sh/src/line-editing/reader.c | 110 +++++++-------- 42sh/src/line-editing/readline.c | 45 +++--- 42sh/src/main/main.c | 39 +++--- 42sh/src/main/remove_trailing_esc_nl.c | 26 ++++ 42sh/src/main/shell_get_opts.c | 3 +- 40 files changed, 517 insertions(+), 633 deletions(-) delete mode 100644 42sh/includes/line_editing.h delete mode 100644 42sh/includes/lst.h rename 42sh/src/lexer/{get_lexer_state.c => get_state_global.c} (62%) rename 42sh/src/lexer/{ft_lexer.c => get_state_redir.c} (62%) create mode 100644 42sh/src/lexer/lexer_bquote.c rename 42sh/src/lexer/{ft_tokenize.c => lexer_lex.c} (69%) rename 42sh/src/lexer/{lexer_special.c => lexer_subshell.c} (80%) create mode 100644 42sh/src/lexer/stack_to_prompt.c delete mode 100644 42sh/src/line-editing/check_backslash.c rename 42sh/src/line-editing/{prompt.c => ftprompt.c} (92%) create mode 100644 42sh/src/main/remove_trailing_esc_nl.c diff --git a/42sh/Makefile b/42sh/Makefile index 119c5015..d09f5200 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -137,11 +137,11 @@ job-control/sigtstp_handler.c\ job-control/sigttin_handler.c\ job-control/sigttou_handler.c\ lexer/command_getoutput.c\ -lexer/ft_lexer.c\ lexer/ft_post_tokenize.c\ -lexer/ft_tokenize.c\ -lexer/get_lexer_state.c\ +lexer/get_state_global.c\ +lexer/get_state_redir.c\ lexer/lexer_backslash.c\ +lexer/lexer_bquote.c\ lexer/lexer_comment.c\ lexer/lexer_default.c\ lexer/lexer_delim.c\ @@ -150,14 +150,16 @@ lexer/lexer_great.c\ lexer/lexer_greatand.c\ lexer/lexer_less.c\ lexer/lexer_lessand.c\ +lexer/lexer_lex.c\ lexer/lexer_newline.c\ lexer/lexer_number.c\ lexer/lexer_quote.c\ lexer/lexer_sep.c\ -lexer/lexer_special.c\ +lexer/lexer_subshell.c\ lexer/lexer_word.c\ lexer/reduce_bquotes.c\ lexer/reduce_parens.c\ +lexer/stack_to_prompt.c\ lexer/token_append.c\ lexer/token_cmp_type.c\ lexer/token_expand_var.c\ @@ -165,10 +167,10 @@ lexer/token_free.c\ lexer/token_init.c\ lexer/token_print.c\ line-editing/builtin_history.c\ -line-editing/check_backslash.c\ line-editing/completion.c\ line-editing/control_c_and_d.c\ line-editing/copy_cut_paste.c\ +line-editing/ftprompt.c\ line-editing/get_touch.c\ line-editing/get_touch_toolz.c\ line-editing/get_touch_toolz_2.c\ @@ -180,7 +182,6 @@ line-editing/history_parsing_toolz_2.c\ line-editing/list_toolz.c\ line-editing/move_to_line.c\ line-editing/print_and_del.c\ -line-editing/prompt.c\ line-editing/reader.c\ line-editing/readline.c\ line-editing/surch_in_history.c\ @@ -198,6 +199,7 @@ main/ft_putast.c\ main/ft_putast2.c\ main/lib_expansion.c\ main/main.c\ +main/remove_trailing_esc_nl.c\ main/shell_exit.c\ main/shell_get_avdata.c\ main/shell_get_opts.c\ diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index 97297893..df03cd61 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/05 17:44:07 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 17:24:55 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -52,19 +52,19 @@ # define TOUCHE_F5 892427035 # define TOUCHE_F6 925981467 -# define PROMPT_QUOTES "quote> " -# define PROMPT_DQUOTES "dquote> " -# define PROMPT_BQUOTES "bquote> " -# define PROMPT_ACCOLADE "cursh> " -# define PROMPT_BRACKET "subsh> " -# define PROMPT_BSLASH "> " +/* # define PROMPT_QUOTES "quote> " */ +/* # define PROMPT_DQUOTES "dquote> " */ +/* # define PROMPT_BQUOTES "bquote> " */ +/* # define PROMPT_ACCOLADE "cursh> " */ +/* # define PROMPT_BRACKET "subsh> " */ +/* # define PROMPT_BSLASH "> " */ -# define SIZE_PROMPT_QUOTES 7 -# define SIZE_PROMPT_DQUOTES 8 -# define SIZE_PROMPT_BQUOTES 8 -# define SIZE_PROMPT_ACCOLADE 7 -# define SIZE_PROMPT_BRACKET 7 -# define SIZE_PROMPT_BSLASH 2 +/* # define SIZE_PROMPT_QUOTES 7 */ +/* # define SIZE_PROMPT_DQUOTES 8 */ +/* # define SIZE_PROMPT_BQUOTES 8 */ +/* # define SIZE_PROMPT_ACCOLADE 7 */ +/* # define SIZE_PROMPT_BRACKET 7 */ +/* # define SIZE_PROMPT_BSLASH 2 */ # define IS_QUOTES (1 << 0) # define IS_BQUOTES (1 << 1) @@ -177,7 +177,7 @@ void ft_x(void); void ft_v(void); void ft_history_parsing(void); void ft_read_it(int input, size_t *pos, char **str); -int ft_readline(void); +char *readline(char *); int ft_completion(int ret); void ft_check_heredoc(char **str); diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index ffad6bcf..b9f11bde 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:50 by jhalford #+# #+# */ -/* Updated: 2017/02/07 18:06:47 by jhalford ### ########.fr */ +/* Updated: 2017/02/10 00:33:36 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,8 @@ # define LEXER_H # include "minishell.h" - -typedef long long t_type; +# include "libft.h" +# include "types.h" # define TK_LESS (1 << 0) # define TK_GREAT (1 << 1) @@ -56,8 +56,9 @@ enum e_lexstate LESSAND, QUOTE, DQUOTE, + BQUOTE, BACKSLASH, - SPECIAL, + SUBSHELL, COMMENT, }; @@ -70,19 +71,22 @@ struct s_token int size; }; -typedef struct s_data t_data; -typedef struct s_token t_token; -typedef enum e_lexstate t_lexstate; +struct s_lexer +{ + char *str; + int pos; + t_lexstate state; + t_list *stack; +}; -extern int (*g_lexer[])(t_list **alst, char *str); -int ft_lexer(t_list **alst, char **str); -int ft_tokenize(t_list **alst, char *str, t_lexstate state); +extern int (*g_lexer[])(t_list **alst, t_lexer *lexer); + int ft_post_tokenize(t_list **alst, char **str); t_token *token_init(); -int token_append(t_token *token, char c, short int esc, - short int dbl_esc); +int token_append(t_token *token, t_lexer *lexer, + short int esc, short int esc2); void token_free(void *data, size_t size); int token_cmp_type(t_token *token, t_type *ref); void token_print(t_list *lst); @@ -93,22 +97,26 @@ int reduce_bquotes(t_list **alst, char **str); char *command_getoutput(char *command); int ft_is_delim(char c); +char *stack_to_prompt(t_list *stack); -t_lexstate get_lexer_state(char *str); -int lexer_default(t_list **alst, char *str); -int lexer_newline(t_list **alst, char *str); -int lexer_delim(t_list **alst, char *str); -int lexer_sep(t_list **alst, char *str); -int lexer_word(t_list **alst, char *str); -int lexer_number(t_list **alst, char *str); -int lexer_less(t_list **alst, char *str); -int lexer_great(t_list **alst, char *str); -int lexer_lessand(t_list **alst, char *str); -int lexer_greatand(t_list **alst, char *str); -int lexer_quote(t_list **alst, char *str); -int lexer_dquote(t_list **alst, char *str); -int lexer_backslash(t_list **alst, char *str); -int lexer_special(t_list **alst, char *str); -int lexer_comment(t_list **alst, char *str); +t_lexstate get_state_global(t_lexer *lexer); +t_lexstate get_state_redir(t_lexer *lexer); +int lexer_lex(t_list **alst, t_lexer *lexer); +int lexer_default(t_list **alst, t_lexer *lexer); +int lexer_newline(t_list **alst, t_lexer *lexer); +int lexer_delim(t_list **alst, t_lexer *lexer); +int lexer_sep(t_list **alst, t_lexer *lexer); +int lexer_word(t_list **alst, t_lexer *lexer); +int lexer_number(t_list **alst, t_lexer *lexer); +int lexer_less(t_list **alst, t_lexer *lexer); +int lexer_great(t_list **alst, t_lexer *lexer); +int lexer_lessand(t_list **alst, t_lexer *lexer); +int lexer_greatand(t_list **alst, t_lexer *lexer); +int lexer_quote(t_list **alst, t_lexer *lexer); +int lexer_dquote(t_list **alst, t_lexer *lexer); +int lexer_bquote(t_list **alst, t_lexer *lexer); +int lexer_backslash(t_list **alst, t_lexer *lexer); +int lexer_subshell(t_list **alst, t_lexer *lexer); +int lexer_comment(t_list **alst, t_lexer *lexer); #endif diff --git a/42sh/includes/line_editing.h b/42sh/includes/line_editing.h deleted file mode 100644 index 941853ac..00000000 --- a/42sh/includes/line_editing.h +++ /dev/null @@ -1,89 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* line-editing.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/10 13:38:21 by jhalford #+# #+# */ -/* Updated: 2017/01/10 12:46:19 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef LINE_EDITING_H -# define LINE_EDITING_H - -# include "minishell.h" -# include -# include - -# define SHELL_PROMPT "$> " -# define BUFF_SIZE 32 -# define READ_BUF 32 -# define FT_KEY_C_C "\x3" -# define FT_KEY_C_D "\x4" -# define FT_KEY_C_H "\x8" -# define FT_KEY_TAB "\x9" -# define FT_KEY_ENTER "\xa" -# define FT_KEY_C_K "\xb" -# define FT_KEY_C_L "\xc" -# define FT_KEY_C_U "\x15" -# define FT_KEY_C_Z "\x1a" -# define FT_KEY_ESC "\x1b" -# define FT_KEY_UP "\x1b\x5b\x41" -# define FT_KEY_DOWN "\x1b\x5b\x42" -# define FT_KEY_RIGHT "\x1b\x5b\x43" -# define FT_KEY_LEFT "\x1b\x5b\x44" -# define FT_KEY_C_UP "\x1b\x4f\x41" -# define FT_KEY_C_DOWN "\x1b\x4f\x42" -# define FT_KEY_C_RIGHT "\x1b\x4f\x43" -# define FT_KEY_C_LEFT "\x1b\x4f\x44" -# define FT_KEY_SQUOTE "\x22" -# define FT_KEY_DQUOTE "\x27" -# define FT_KEY_BSLASH "\x5c" -# define FT_KEY_DEL "\x7f" - -enum e_qstate -{ - Q_NONE, - Q_QUOTE, - Q_DQUOTE, - Q_BACKSLASH, -}; - -typedef struct s_data t_data; -typedef enum e_qstate t_qstate; - -extern t_stof g_keys[]; - -int ft_interactive_sh(t_data *data); -int input_init(t_data *data); -int ft_set_termios(t_data *data, int input_mode); -int ft_prompt(void); - -int ft_history_add(t_data *data); - -int ft_clear_line(t_data *data, char *buf); -int ft_line_up(t_data *data, char *buf); -int ft_line_down(t_data *data, char *buf); -int ft_line_start(t_data *data, char *buf); -int ft_line_end(t_data *data, char *buf); - -int ft_key_del(t_data *data, char *buf); -int ft_key_enter(t_data *data, char *buf); -int ft_key_ctrl_d(t_data *data, char *buf); -int ft_key_ctrl_c(t_data *data, char *buf); -int ft_key_default(t_data *data, char *buf); - -int ft_history_up(t_data *data, char *buf); -int ft_history_down(t_data *data, char *buf); -int ft_cursor_left(t_data *data, char *buf); -int ft_cursor_right(t_data *data, char *buf); -int ft_word_left(t_data *data, char *buf); -int ft_word_right(t_data *data, char *buf); - -void qstate_none(t_qstate *new, char c); -void qstate_quote(t_qstate *new, char c); -void qstate_dquote(t_qstate *new, char c); - -#endif diff --git a/42sh/includes/lst.h b/42sh/includes/lst.h deleted file mode 100644 index ee4926df..00000000 --- a/42sh/includes/lst.h +++ /dev/null @@ -1,80 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* lst.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/07 13:27:46 by jhalford #+# #+# */ -/* Updated: 2016/12/12 14:59:12 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef LST_H -# define LST_H - -# include "libft.h" - -struct s_list -{ - void *content; - size_t content_size; - struct s_list *next; -}; - -typedef struct s_list t_list; - -t_list *ft_lstnew(void const *content, size_t content_size); -void ft_lstdel(t_list **alst, void (*del)(void *, size_t)); -void ft_lstdelone(t_list **alst, void (*del)(void *, size_t)); -void ft_lstadd(t_list **alst, t_list *new); -void ft_lstiter(t_list *lst, void (*f)(t_list *elem)); -t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); - -t_list *ft_lstnew_range(int a, int b); -void ft_lsteadd(t_list **alst, t_list *new); -void ft_lstnadd(t_list **alst, t_list *new, int n); -void ft_lstsort(t_list **begin_list, int (*cmp)()); -void ft_lst_print(t_list *list, void (*printer)()); -int ft_lstsize(t_list *lst); -t_list *ft_lstlast(t_list *lst); -void ft_lst_sorted_merge( - t_list **begin_list1, - t_list *begin_list2, - int (*cmp)()); -void ft_lst_sorted_insert( - t_list **begin_list, - t_list *insert, - int (*cmp)()); -void ft_lst_delif( - t_list **alist, - void *data_ref, - int (*cmp)(), - void (*del)(void *, size_t)); -void ft_lst_delsub( - t_list **alst, - t_list *sub, int (*cmp)(), - void (*del)(void *, size_t)); -void ft_lst_cfree(void *ptr, size_t size); -void ft_lst_bfree(void *ptr, size_t size); -t_list *ft_lst_filter( - t_list *lst, - void const *data_ref, - t_list *(*f)(t_list *elem, void const *)); -t_list *ft_lst_removeif( - t_list **alst, - void *data_ref, - int (*cmp)()); -t_list *ft_lst_find( - t_list *begin_list, - void *data_ref, - int (*cmp)()); -t_list *ft_lstpop(t_list **lst); -void ft_lst_merge(t_list **begin_list1, t_list *begin_list2); -void ft_lst_reverse(t_list **begin_list); - -int ft_diff(void *a, void *b); -t_list *ft_id(t_list *a); -t_list *ft_lst_at(t_list *list, unsigned int nbr); - -#endif diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index fbaaac4c..d1e3fa06 100644 --- a/42sh/includes/minishell.h +++ b/42sh/includes/minishell.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 13:07:44 by jhalford #+# #+# */ -/* Updated: 2017/02/03 12:16:52 by alao ### ########.fr */ +/* Updated: 2017/02/10 00:26:10 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,6 @@ # define SHELL_NAME "minishell" # include "libft.h" - # include "types.h" # include "lexer.h" # include "parser.h" @@ -66,11 +65,11 @@ void shell_exit(void); int data_init(void); void data_exit(void); -int shell_single_command(char *command); - void ft_expand_dollar(char **av, char **env); char *ft_findexec(char *path, char *file); +int remove_trailing_esc_nl(char *str); + char *ft_putast(void *node); void ft_putast2(void *node); diff --git a/42sh/includes/types.h b/42sh/includes/types.h index 07cec9b7..d2d802aa 100644 --- a/42sh/includes/types.h +++ b/42sh/includes/types.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:11:48 by jhalford #+# #+# */ -/* Updated: 2017/02/03 15:03:52 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 19:52:04 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,10 @@ typedef struct s_exec t_exec; typedef struct s_jobc t_jobc; typedef enum e_mode t_mode; +typedef struct s_lexer t_lexer; +typedef enum e_lexstate t_lexstate; +typedef struct s_token t_token; + typedef struct s_parser t_parser; typedef struct s_ld t_ld; typedef struct s_astnode t_astnode; diff --git a/42sh/libft b/42sh/libft index b53fcb9d..acd7e54f 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit b53fcb9db8b4baf53c73b17726f1740c4af12be0 +Subproject commit acd7e54fb8045b3958dd239d469f1476404468b7 diff --git a/42sh/src/lexer/get_lexer_state.c b/42sh/src/lexer/get_state_global.c similarity index 62% rename from 42sh/src/lexer/get_lexer_state.c rename to 42sh/src/lexer/get_state_global.c index 9a738e65..3f59ab73 100644 --- a/42sh/src/lexer/get_lexer_state.c +++ b/42sh/src/lexer/get_state_global.c @@ -1,32 +1,37 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* get_lexer_state.c :+: :+: :+: */ +/* get_state_global.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/10 13:45:46 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:34:14 by wescande ### ########.fr */ +/* Created: 2017/02/09 20:39:06 by jhalford #+# #+# */ +/* Updated: 2017/02/09 22:12:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -t_lexstate get_lexer_state(char *str) +t_lexstate get_state_global(t_lexer *lexer) { - if (ft_is_delim(*str)) + char c; + + c = lexer->str[lexer->pos]; + if (ft_is_delim(c)) return (DELIM); - else if (*str == '#') + else if (c == '#') return (COMMENT); - else if (*str == '&' || *str == ';' || *str == '|') + else if (c == '&' || c == ';' || c == '|') return (SEP); - else if (*str == '\\') + else if (c == '\\') return (BACKSLASH); - else if (*str == '\'') + else if (c == '\'') return (QUOTE); - else if (*str == '\"') + else if (c == '\"') return (DQUOTE); - else if (*str == '(' || *str == ')' || *str == '`') - return (SPECIAL); + else if (c == '`') + return (BQUOTE); + else if (c == '(' || c == ')') + return (SUBSHELL); return (0); } diff --git a/42sh/src/lexer/ft_lexer.c b/42sh/src/lexer/get_state_redir.c similarity index 62% rename from 42sh/src/lexer/ft_lexer.c rename to 42sh/src/lexer/get_state_redir.c index 71b033f1..7b6acd31 100644 --- a/42sh/src/lexer/ft_lexer.c +++ b/42sh/src/lexer/get_state_redir.c @@ -1,28 +1,25 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_lexer.c :+: :+: :+: */ +/* get_state_redir.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/02 15:30:59 by jhalford #+# #+# */ -/* Updated: 2017/02/06 21:49:55 by jhalford ### ########.fr */ +/* Created: 2017/02/09 20:37:28 by jhalford #+# #+# */ +/* Updated: 2017/02/09 20:39:11 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int ft_lexer(t_list **alst, char **command) +t_lexstate get_state_redir(t_lexer *lexer) { - int ret; + char c; - if (!*command) - return (1); - ret = 0; - if (ft_tokenize(alst, *command, DEFAULT)) - ret = 1; - else if (ft_post_tokenize(alst, command)) - ret = 1; - ft_strdel(command); - return (ret); + c = lexer->str[lexer->pos]; + if (c == '>') + return (GREAT); + else if (c == '<') + return (LESS); + return (0); } diff --git a/42sh/src/lexer/lexer_backslash.c b/42sh/src/lexer/lexer_backslash.c index eb339d0a..a2f02f7c 100644 --- a/42sh/src/lexer/lexer_backslash.c +++ b/42sh/src/lexer/lexer_backslash.c @@ -6,18 +6,21 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:56:49 by jhalford #+# #+# */ -/* Updated: 2017/02/07 11:39:15 by wescande ### ########.fr */ +/* Updated: 2017/02/09 19:53:50 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_backslash(t_list **alst, char *str) +int lexer_backslash(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; token->type = TK_WORD; - token_append(token, str[1], 1, 1); - return (ft_tokenize(alst, str + 2, WORD)); + lexer->pos++; + token_append(token, lexer, 1, 1); + lexer->pos++; + lexer->state = WORD; + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c new file mode 100644 index 00000000..a9e32dda --- /dev/null +++ b/42sh/src/lexer/lexer_bquote.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_bquote.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 22:03:48 by jhalford #+# #+# */ +/* Updated: 2017/02/09 22:07:04 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +int lexer_bquote(t_list **alst, t_lexer *lexer) +{ + t_token *token; + + token = (*alst)->content; + token->type = TK_Q_WORD; + lexer->pos++; + push(&lexer->stack, BQUOTE); + if (lexer->str[lexer->pos] == '`') + { + lexer->state = WORD; + lexer->pos++; + pop(&lexer->stack); + return (lexer_lex(alst, lexer)); + } + else if (lexer->str[lexer->pos] == 0) + return (0); + token_append(token, lexer, 0, 0); + return (lexer_quote(alst, lexer)); +} + diff --git a/42sh/src/lexer/lexer_comment.c b/42sh/src/lexer/lexer_comment.c index f744ca44..71f053cd 100644 --- a/42sh/src/lexer/lexer_comment.c +++ b/42sh/src/lexer/lexer_comment.c @@ -6,18 +6,18 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/07 12:15:59 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:56:53 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 19:54:11 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_comment(t_list **alst, char *str) +int lexer_comment(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; - if (*str == '\n') - return (ft_tokenize(&(*alst)->next, str, NEWLINE)); - return (lexer_comment(alst, str + 1)); + if (lexer->str[lexer->pos] == '\n') + return (lexer_lex(&(*alst)->next, lexer)); + return (lexer_comment(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_default.c b/42sh/src/lexer/lexer_default.c index 0359269c..ed43b9d6 100644 --- a/42sh/src/lexer/lexer_default.c +++ b/42sh/src/lexer/lexer_default.c @@ -6,29 +6,35 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:21 by jhalford #+# #+# */ -/* Updated: 2017/02/07 11:39:07 by wescande ### ########.fr */ +/* Updated: 2017/02/09 20:40:28 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_default(t_list **alst, char *str) +int lexer_default(t_list **alst, t_lexer *lexer) { t_lexstate state; t_token *token; + char c; - if ((state = get_lexer_state(str))) - return (ft_tokenize(alst, str, state)); - if (*str == '>') - return (ft_tokenize(alst, str, GREAT)); - else if (*str == '<') - return (ft_tokenize(alst, str, LESS)); - else if (ft_isdigit(*str)) - state = NUMBER; + c = lexer->str[lexer->pos]; + if ((state = get_state_global(lexer))) + { + lexer->state = state; + return (lexer_lex(alst, lexer)); + } + if ((state = get_state_redir(lexer))) + { + lexer->state = state; + return (lexer_lex(alst, lexer)); + } + else if (ft_isdigit(c)) + lexer->state = NUMBER; else - state = WORD; + lexer->state = WORD; token = (*alst)->content; - token_append(token, *str, 0, 0); + token_append(token, lexer, 0, 0); token->type = TK_N_WORD; - return (ft_tokenize(alst, str + 1, state)); + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_delim.c b/42sh/src/lexer/lexer_delim.c index 8e27dd19..6fa29b29 100644 --- a/42sh/src/lexer/lexer_delim.c +++ b/42sh/src/lexer/lexer_delim.c @@ -6,25 +6,25 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:58:44 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:48:11 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 20:02:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_delim(t_list **alst, char *str) +int lexer_delim(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; - while (ft_is_delim(*str)) - str++; + while (ft_is_delim(lexer->str[lexer->pos])) + lexer->pos++; if (token->type) - return (ft_tokenize(&(*alst)->next, str, DEFAULT)); + return (lexer_lex(&(*alst)->next, lexer)); else { - if (!*str) + if (!lexer->str[lexer->pos]) ft_lst_delif(alst, (*alst)->content, &ft_addrcmp, &token_free); - return (ft_tokenize(alst, str, DEFAULT)); + return (lexer_lex(alst, lexer)); } } diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 9d52263b..7077fd7b 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -6,28 +6,45 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:58 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:35:38 by wescande ### ########.fr */ +/* Updated: 2017/02/10 00:33:34 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_dquote(t_list **alst, char *str) +int lexer_dquote(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; token->type = TK_DQ_WORD; - str++; - if (*str == '"') - return (ft_tokenize(alst, str + 1, DEFAULT)); - if (*str == '\\') + if (*(int*)lexer->stack->content != DQUOTE) + push(&lexer->stack, DQUOTE); + lexer->pos++; + if (lexer->str[lexer->pos] == '"') { - if (str[1] != '"') - token_append(token, str[0], 1, 0); - token_append(token, str[1], 1, 1); - return (lexer_dquote(alst, str + 1)); + lexer->pos++; + lexer->state = WORD; + pop(&lexer->stack); + return (lexer_lex(alst, lexer)); } - token_append(token, *str, 1, 0); - return (lexer_dquote(alst, str)); + else if (lexer->str[lexer->pos] == '\\') + { + if (lexer->str[lexer->pos + 1] == '"') + token_append(token, lexer, 1, 0); + else if (lexer->str[lexer->pos + 1] == 0) + { + push(&lexer->stack, BACKSLASH); + return (0); + } + lexer->pos++; + token_append(token, lexer, 1, 1); + return (lexer_dquote(alst,lexer)); + } + else if (lexer->str[lexer->pos] == '`') + lexer_bquote(alst, lexer); + else if (lexer->str[lexer->pos] == 0) + return (0); + token_append(token, lexer, 1, 0); + return (lexer_dquote(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_great.c b/42sh/src/lexer/lexer_great.c index a0f069c8..5731cdae 100644 --- a/42sh/src/lexer/lexer_great.c +++ b/42sh/src/lexer/lexer_great.c @@ -6,33 +6,39 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:35 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:36:19 by wescande ### ########.fr */ +/* Updated: 2017/02/09 19:57:29 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_great(t_list **alst, char *str) +int lexer_great(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; - token_append(token, str[0], 0, 0); - if (*(str + 1) == '&') + token_append(token, lexer, 0, 0); + if (lexer->str[lexer->pos + 1] == '&') { token->type = TK_GREATAND; - token_append(token, str[1], 0, 0); - return (lexer_greatand(alst, str + 2)); + lexer->pos++; + token_append(token, lexer, 0, 0); + lexer->pos++; + return (lexer_greatand(alst, lexer)); } - else if (*(str + 1) == '>') + if (lexer->str[lexer->pos + 1] == '>') { token->type = TK_DGREAT; - token_append(token, str[1], 0, 0); - return (ft_tokenize(&(*alst)->next, str + 2, DEFAULT)); + lexer->pos++; + token_append(token, lexer, 0, 0); + lexer->pos++; + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } else { token->type = TK_GREAT; - return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT)); + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } } diff --git a/42sh/src/lexer/lexer_greatand.c b/42sh/src/lexer/lexer_greatand.c index d9f9787f..d2da04ed 100644 --- a/42sh/src/lexer/lexer_greatand.c +++ b/42sh/src/lexer/lexer_greatand.c @@ -6,27 +6,31 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:56:58 by jhalford #+# #+# */ -/* Updated: 2017/02/07 11:37:08 by wescande ### ########.fr */ +/* Updated: 2017/02/09 19:56:40 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_greatand(t_list **alst, char *str) +int lexer_greatand(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; token->type = TK_GREATAND; - if (ft_isdigit(*str)) + if (ft_isdigit(lexer->str[lexer->pos])) { - token_append(token, *str, 0, 0); - return (lexer_greatand(alst, str + 1)); + token_append(token, lexer, 0, 0); + lexer->str++; + return (lexer_greatand(alst, lexer)); } - else if (*str == '-') + else if (lexer->str[lexer->pos] == '-') { - token_append(token, *str, 0, 0); - return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT)); + token_append(token, lexer, 0, 0); + lexer->str++; + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } - return (ft_tokenize(alst, str, DEFAULT)); + lexer->state = DEFAULT; + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_less.c b/42sh/src/lexer/lexer_less.c index 7f067ab0..00798f44 100644 --- a/42sh/src/lexer/lexer_less.c +++ b/42sh/src/lexer/lexer_less.c @@ -6,33 +6,39 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:53 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:36:42 by wescande ### ########.fr */ +/* Updated: 2017/02/09 20:37:37 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_less(t_list **alst, char *str) +int lexer_less(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; - token_append(token, str[0], 0, 0); - if (*(str + 1) == '&') + token_append(token, lexer, 0, 0); + if (lexer->str[lexer->pos + 1] == '&') { token->type = TK_LESSAND; - token_append(token, str[1], 0, 0); - return (lexer_lessand(alst, str + 2)); + lexer->pos++; + token_append(token, lexer, 0, 0); + lexer->pos++; + return (lexer_lessand(alst, lexer)); } - else if (*(str + 1) == '<') + if (lexer->str[lexer->pos + 1] == '<') { token->type = TK_DLESS; - token_append(token, str[1], 0, 0); - return (ft_tokenize(&(*alst)->next, str + 2, DEFAULT)); + lexer->pos++; + token_append(token, lexer, 0, 0); + lexer->pos++; + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } else { token->type = TK_LESS; - return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT)); + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } } diff --git a/42sh/src/lexer/lexer_lessand.c b/42sh/src/lexer/lexer_lessand.c index 04c7fe8e..cf1547cc 100644 --- a/42sh/src/lexer/lexer_lessand.c +++ b/42sh/src/lexer/lexer_lessand.c @@ -6,27 +6,31 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:58:51 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:37:07 by wescande ### ########.fr */ +/* Updated: 2017/02/09 19:56:29 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_lessand(t_list **alst, char *str) +int lexer_lessand(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; token->type = TK_LESSAND; - if (ft_isdigit(*str)) + if (ft_isdigit(lexer->str[lexer->pos])) { - token_append(token, *str, 0, 0); - return (lexer_lessand(alst, str + 1)); + token_append(token, lexer, 0, 0); + lexer->str++; + return (lexer_lessand(alst, lexer)); } - else if (*str == '-') + else if (lexer->str[lexer->pos] == '-') { - token_append(token, *str, 0, 0); - return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT)); + token_append(token, lexer, 0, 0); + lexer->str++; + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } - return (ft_tokenize(alst, str, DEFAULT)); + lexer->state = DEFAULT; + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/ft_tokenize.c b/42sh/src/lexer/lexer_lex.c similarity index 69% rename from 42sh/src/lexer/ft_tokenize.c rename to 42sh/src/lexer/lexer_lex.c index fccf7a7a..a406fbc8 100644 --- a/42sh/src/lexer/ft_tokenize.c +++ b/42sh/src/lexer/lexer_lex.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_tokenize.c :+: :+: :+: */ +/* lexer_lex.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ +/* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/10 13:37:11 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:33:34 by wescande ### ########.fr */ +/* Created: 2017/02/09 17:08:51 by jhalford #+# #+# */ +/* Updated: 2017/02/09 22:58:48 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int (*g_lexer[])(t_list **alst, char *str) = +int (*g_lexer[])(t_list **alst, t_lexer *lexer) = { &lexer_default, &lexer_newline, @@ -26,8 +26,9 @@ int (*g_lexer[])(t_list **alst, char *str) = &lexer_lessand, &lexer_quote, &lexer_dquote, + &lexer_bquote, &lexer_backslash, - &lexer_special, + &lexer_subshell, &lexer_comment, }; @@ -36,16 +37,16 @@ int ft_is_delim(char c) return (c == ' ' || c == '\t' || c == '\n'); } -int ft_tokenize(t_list **alst, char *str, t_lexstate state) +int lexer_lex(t_list **alst, t_lexer *lexer) { t_token *token; - if (!*str) + if (!lexer->str[lexer->pos]) return (0); if (!*alst) { token = token_init(); *alst = ft_lstnew(token, sizeof(*token)); } - return ((*g_lexer[state])(alst, str)); + return ((*g_lexer[lexer->state])(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_newline.c b/42sh/src/lexer/lexer_newline.c index c563d2eb..396dc6d3 100644 --- a/42sh/src/lexer/lexer_newline.c +++ b/42sh/src/lexer/lexer_newline.c @@ -6,13 +6,13 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/23 23:19:46 by ariard #+# #+# */ -/* Updated: 2017/02/07 12:54:48 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 19:55:04 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_newline(t_list **alst, char *str) +int lexer_newline(t_list **alst, t_lexer *lexer) { t_token *token; @@ -20,7 +20,7 @@ int lexer_newline(t_list **alst, char *str) { token = (*alst)->content; if (*token->data) - return (lexer_newline(&(*alst)->next, str)); + return (lexer_newline(&(*alst)->next, lexer)); } else { @@ -29,5 +29,5 @@ int lexer_newline(t_list **alst, char *str) } token = (*alst)->content; token->type = TK_NEWLINE; - return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT)); + return (lexer_lex(&(*alst)->next, lexer)); } diff --git a/42sh/src/lexer/lexer_number.c b/42sh/src/lexer/lexer_number.c index 5cb3fa24..b7519817 100644 --- a/42sh/src/lexer/lexer_number.c +++ b/42sh/src/lexer/lexer_number.c @@ -6,28 +6,31 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:45 by jhalford #+# #+# */ -/* Updated: 2017/02/07 11:39:29 by wescande ### ########.fr */ +/* Updated: 2017/02/09 20:41:05 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_number(t_list **alst, char *str) +int lexer_number(t_list **alst, t_lexer *lexer) { t_token *token; t_lexstate state; token = (*alst)->content; - if ((state = get_lexer_state(str))) - return (ft_tokenize(alst, str, state)); - if (*str == '>') - return (ft_tokenize(alst, str, GREAT)); - else if (*str == '<') - return (ft_tokenize(alst, str, LESS)); - else if (ft_isdigit(*str)) + if ((state = get_state_global(lexer))) + return (lexer_lex(alst, lexer)); + else if ((state = get_state_redir(lexer))) { - token_append(token, *str, 0, 0); - return (lexer_number(alst, str + 1)); + lexer->state = state; + return (lexer_lex(alst, lexer)); } - return (ft_tokenize(alst, str, DEFAULT)); + else if (ft_isdigit(lexer->str[lexer->pos])) + { + token_append(token, lexer, 0, 0); + lexer->pos++; + return (lexer_number(alst, lexer)); + } + lexer->state = DEFAULT; + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_quote.c b/42sh/src/lexer/lexer_quote.c index 647ac038..b0764b7d 100644 --- a/42sh/src/lexer/lexer_quote.c +++ b/42sh/src/lexer/lexer_quote.c @@ -6,21 +6,29 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:08 by jhalford #+# #+# */ -/* Updated: 2017/02/07 11:39:24 by wescande ### ########.fr */ +/* Updated: 2017/02/09 22:13:27 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_quote(t_list **alst, char *str) +int lexer_quote(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; token->type = TK_Q_WORD; - str++; - if (*str == '\'') - return (ft_tokenize(alst, str + 1, WORD)); - token_append(token, *str, 1, 1); - return (lexer_quote(alst, str)); + lexer->pos++; + push(&lexer->stack, QUOTE); + if (lexer->str[lexer->pos] == '\'') + { + lexer->state = WORD; + lexer->pos++; + pop(&lexer->stack); + return (lexer_lex(alst, lexer)); + } + else if (lexer->str[lexer->pos] == 0) + return (0); + token_append(token, lexer, 1, 1); + return (lexer_quote(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_sep.c b/42sh/src/lexer/lexer_sep.c index c9b20e78..581f2395 100644 --- a/42sh/src/lexer/lexer_sep.c +++ b/42sh/src/lexer/lexer_sep.c @@ -6,21 +6,23 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 16:29:57 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:53:46 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 20:43:25 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_sep(t_list **alst, char *str) +int lexer_sep(t_list **alst, t_lexer *lexer) { - t_token *token; + t_token *token; + char c; + char cn; if (*alst) { token = (*alst)->content; if (*token->data) - return (lexer_sep(&(*alst)->next, str)); + return (lexer_sep(&(*alst)->next, lexer)); } else { @@ -28,13 +30,13 @@ int lexer_sep(t_list **alst, char *str) *alst = ft_lstnew(token, sizeof(*token)); } token = (*alst)->content; - if (str[0] == '&') - token->type = str[1] == '&' ? TK_AND_IF : TK_AMP; - if (str[0] == '|') - token->type = str[1] == '|' ? TK_OR_IF : TK_PIPE; - token->type = (*str == ';') ? TK_SEMI : token->type; - return (ft_tokenize(&(*alst)->next, - str + 1 + - (token->type & (TK_AND_IF | TK_OR_IF) ? 1 : 0), - DEFAULT)); + c = lexer->str[lexer->pos]; + cn = lexer->str[lexer->pos + 1]; + if (c == '&') + token->type = cn == '&' ? TK_AND_IF : TK_AMP; + else if (c == '|') + token->type = cn == '|' ? TK_OR_IF : TK_PIPE; + token->type = (c == ';') ? TK_SEMI : token->type; + lexer->pos += 1 + (token->type & (TK_AND_IF | TK_OR_IF) ? 1 : 0); + return (lexer_lex(&(*alst)->next, lexer)); } diff --git a/42sh/src/lexer/lexer_special.c b/42sh/src/lexer/lexer_subshell.c similarity index 80% rename from 42sh/src/lexer/lexer_special.c rename to 42sh/src/lexer/lexer_subshell.c index 7d3d7800..278849bb 100644 --- a/42sh/src/lexer/lexer_special.c +++ b/42sh/src/lexer/lexer_subshell.c @@ -6,13 +6,13 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 15:35:38 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:36:10 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 22:09:07 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_special(t_list **alst, char *str) +int lexer_subshell(t_list **alst, t_lexer *lexer) { t_token *token; t_list **lst; @@ -27,12 +27,11 @@ int lexer_special(t_list **alst, char *str) token = token_init(); *lst = ft_lstnew(token, sizeof(*token)); token = (*lst)->content; - if (*str == '(') + if (lexer->str[lexer->pos] == '(') token->type = TK_PAREN_OPEN; - else if (*str == ')') + else if (lexer->str[lexer->pos] == ')') token->type = TK_PAREN_CLOSE; - else if (*str == '`') - token->type = TK_BQUOTE; - token->data = str; - return (ft_tokenize(&(*lst)->next, str + 1, DEFAULT)); + token->data = lexer->str; + lexer->pos++; + return (lexer_lex(&(*lst)->next, lexer)); } diff --git a/42sh/src/lexer/lexer_word.c b/42sh/src/lexer/lexer_word.c index c952c6f5..b5fa0ae9 100644 --- a/42sh/src/lexer/lexer_word.c +++ b/42sh/src/lexer/lexer_word.c @@ -6,25 +6,27 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:11 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:37:44 by wescande ### ########.fr */ +/* Updated: 2017/02/09 20:43:57 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int lexer_word(t_list **alst, char *str) +int lexer_word(t_list **alst, t_lexer *lexer) { t_token *token; t_lexstate state; token = (*alst)->content; token->type = TK_N_WORD; - if ((state = get_lexer_state(str))) - return (ft_tokenize(alst, str, state)); - if (*str == '>') - return (ft_tokenize(&(*alst)->next, str, GREAT)); - else if (*str == '<') - return (ft_tokenize(&(*alst)->next, str, LESS)); - token_append(token, *str, 0, 0); - return (ft_tokenize(alst, str + 1, WORD)); + if ((state = get_state_global(lexer))) + return (lexer_lex(alst, lexer)); + if ((state = get_state_redir(lexer))) + { + lexer->state = state; + return (lexer_lex(alst, lexer)); + } + token_append(token, lexer, 0, 0); + lexer->pos++; + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/reduce_bquotes.c b/42sh/src/lexer/reduce_bquotes.c index 4e293684..f7c416de 100644 --- a/42sh/src/lexer/reduce_bquotes.c +++ b/42sh/src/lexer/reduce_bquotes.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */ -/* Updated: 2017/02/03 15:40:36 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 20:45:08 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ int reduce_bquotes(t_list **alst, char **str) char *fit; char *bq_start; char *bq_end; + t_lexer lexer; tk = TK_BQUOTE; if ((start = ft_lst_find(*alst, &tk, token_cmp_type))) @@ -44,7 +45,11 @@ int reduce_bquotes(t_list **alst, char **str) ft_strdel(str); *str = new; ft_lstdel(alst, token_free); - ft_tokenize(alst, new, DEFAULT); + + lexer.pos = 0; + lexer.str = *str; + lexer.state = DEFAULT; + lexer_lex(alst, &lexer); return (1); } return (0); diff --git a/42sh/src/lexer/stack_to_prompt.c b/42sh/src/lexer/stack_to_prompt.c new file mode 100644 index 00000000..0343dcb2 --- /dev/null +++ b/42sh/src/lexer/stack_to_prompt.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* stack_to_prompt.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 21:25:26 by jhalford #+# #+# */ +/* Updated: 2017/02/09 22:49:51 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +char *stack_to_prompt(t_list *stack) +{ + t_flag top; + + if (!stack) + return (NULL); + top = *(int*)stack->content; + if (top == BACKSLASH) + return ("> "); + else if (top == QUOTE) + return ("quote >"); + else if (top == DQUOTE) + return ("dquote >"); + else if (top == BQUOTE) + return ("bquote >"); + else if (top == SUBSHELL) + return ("subsh >"); + else + return (" > "); +} diff --git a/42sh/src/lexer/token_append.c b/42sh/src/lexer/token_append.c index d7205017..b2b00fb3 100644 --- a/42sh/src/lexer/token_append.c +++ b/42sh/src/lexer/token_append.c @@ -6,16 +6,18 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/11 17:18:42 by jhalford #+# #+# */ -/* Updated: 2017/02/08 13:55:31 by wescande ### ########.fr */ +/* Updated: 2017/02/09 19:37:27 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "lexer.h" -int token_append(t_token *token, char c, short int esc, short int esc2) +int token_append(t_token *token, t_lexer *lexer, short int esc, short int esc2) { int len; + char c; + c = lexer->str[lexer->pos]; len = ft_strlen(token->data); if (len >= token->size) { diff --git a/42sh/src/line-editing/check_backslash.c b/42sh/src/line-editing/check_backslash.c deleted file mode 100644 index 4d8412b9..00000000 --- a/42sh/src/line-editing/check_backslash.c +++ /dev/null @@ -1,128 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* check_backslash.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: gwojda +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/26 13:32:52 by gwojda #+# #+# */ -/* Updated: 2017/02/05 17:43:44 by gwojda ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -t_prompt_type g_prompt_tab[] = -{ - {IS_QUOTES , SIZE_PROMPT_QUOTES , PROMPT_QUOTES }, - {IS_BQUOTES , SIZE_PROMPT_BQUOTES , PROMPT_BQUOTES }, - {IS_DQUOTES , SIZE_PROMPT_DQUOTES , PROMPT_DQUOTES }, - {IS_ACCOLADE , SIZE_PROMPT_ACCOLADE , PROMPT_ACCOLADE }, - {IS_BRACKET , SIZE_PROMPT_BRACKET , PROMPT_BRACKET }, - {IS_BSLASH , SIZE_PROMPT_BSLASH , PROMPT_BSLASH }, - {0 , 0 , 0 }, -}; - -t_brackets g_brackets = {0 , {0}}; - -void ft_read_more(short c) -{ - char *str_tmp; - char *str_tmp2; - int i; - - i = 0; - str_tmp2 = data_singleton()->line.input; - str_tmp = ft_strjoin(str_tmp2, "\n"); - free(str_tmp2); - STR = NULL; - POS = 0; - while (g_prompt_tab[i].key && !(g_prompt_tab[i].key & c)) - ++i; - data_singleton()->line.prompt_size = g_prompt_tab[i].value; - ft_printf("\n%s", g_prompt_tab[i].new_prompt); - str_tmp2 = ft_read_stdin(); - str_tmp2 = ft_strjoin(str_tmp, STR); - free(str_tmp); - free(STR); - STR = str_tmp2; - ft_check_line(); -} - -static void ft_check_this_char_quotes(char c, short *status) -{ - int i; - char *stats; - - i = 0; - stats = "\'`\"\\"; - while (stats[i] && stats[i] != c) - ++i; - if (!stats[i]) - return ; - if ((1 << i) & ~(*status)) - { - if (((1 << i) > *status && (*status == 0 && !(IS_QUOTES & *status) - && (!(IS_DQUOTES & *status)))) - || (((1 << i) == IS_BQUOTES) && !(IS_QUOTES & *status))) - (*status) = (*status) | (1 << i); - } - else - (*status) = (*status) ^ (1 << i); -} - -static int ft_brackets(char c) -{ - if (c == '(') - { - g_brackets.tabl[g_brackets.pos] = '('; - ++g_brackets.pos; - } - else if (c == '{') - { - g_brackets.tabl[g_brackets.pos] = '{'; - ++g_brackets.pos; - } - else if (c == '}') - { - if (!g_brackets.pos || g_brackets.tabl[g_brackets.pos - 1] != '{') - return (1); - g_brackets.tabl[--g_brackets.pos] = '\0'; - } - else if (c == ')') - { - if (!g_brackets.pos || g_brackets.tabl[g_brackets.pos - 1] != '(') - return (1); - g_brackets.tabl[--g_brackets.pos] = '\0'; - } - return (0); -} - -void ft_check_line(void) -{ - int i; - short status; - - i = -1; - status = 0; - ft_reset_tab((char *)g_brackets.tabl); - g_brackets.pos = 0; - if (!STR) - return ; - while (STR[++i]) - { - if (IS_BSLASH & status) - status = status ^ IS_BSLASH; - else - { - ft_check_this_char_quotes(STR[i], &status); - if (!status && ft_brackets(STR[i])) - return ; - } - } - if (g_brackets.pos && g_brackets.tabl[0] == '(') - status = status | IS_BRACKET; - else if (g_brackets.pos && g_brackets.tabl[0] == '{') - status = status | IS_ACCOLADE; - (status) ? ft_read_more(status) : 0; -} diff --git a/42sh/src/line-editing/prompt.c b/42sh/src/line-editing/ftprompt.c similarity index 92% rename from 42sh/src/line-editing/prompt.c rename to 42sh/src/line-editing/ftprompt.c index ea94ec3b..85f2427d 100644 --- a/42sh/src/line-editing/prompt.c +++ b/42sh/src/line-editing/ftprompt.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* prompt.c :+: :+: :+: */ +/* ft_prompt.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:51:33 by gwojda #+# #+# */ -/* Updated: 2017/02/05 17:42:23 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 16:49:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,7 +51,7 @@ static int ft_currend_dir(void) return (ft_strlen(env[i] + j + 1)); } -void ft_prompt(void) +void ft_prompt() { int ret; diff --git a/42sh/src/line-editing/get_touch.c b/42sh/src/line-editing/get_touch.c index bea7ad8a..71c31e85 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/05 16:57:57 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 17:25:01 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -71,7 +71,7 @@ char *ft_read_stdin(void) ft_print(ret); else if (ret == 10) return (STR); - else if (ft_isascii(ret) == 0) - ft_read_it(ret, &POS, &STR); + /* else if (ft_isascii(ret) == 0) */ + /* ft_read_it(ret, &POS, &STR); */ } } diff --git a/42sh/src/line-editing/history.c b/42sh/src/line-editing/history.c index b2e40292..cab1a3ac 100644 --- a/42sh/src/line-editing/history.c +++ b/42sh/src/line-editing/history.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/02 15:22:19 by gwojda #+# #+# */ -/* Updated: 2017/02/05 17:00:18 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 16:24:02 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/history_parsing.c b/42sh/src/line-editing/history_parsing.c index 15288f3c..b7187bc9 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/05 16:58:43 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 16:25:31 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,7 @@ static int ft_history_parsing_4(char *str, int *i) { 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); + ft_atoi(str + (*i) + 1), ft_nbr_len(ft_atoi(str + *i + 1)) + 1); (*i) += tmp; return (1); } @@ -43,16 +43,16 @@ static int ft_history_parsing_3(char *str, int *i) { 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); + data_singleton()->line.list_size - ft_atoi(str + *i + 2), + ft_nbr_len(ft_atoi(str + *i + 2)) + 2); i += tmp; } else if (str[*i + 1] == '?') ft_realloc_str_history_3(&(data_singleton()->line.input), *i, - ft_strdupi_w(str + *i + 2)); + ft_strdupi_w(str + *i + 2)); else if (str[*i + 1] != ' ') ft_realloc_str_history_2(&(data_singleton()->line.input), *i, - ft_strdupi_w(str + *i + 1)); + ft_strdupi_w(str + *i + 1)); else return (0); return (1); diff --git a/42sh/src/line-editing/reader.c b/42sh/src/line-editing/reader.c index 684afd69..3068e52d 100644 --- a/42sh/src/line-editing/reader.c +++ b/42sh/src/line-editing/reader.c @@ -6,66 +6,66 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/19 16:52:57 by gwojda #+# #+# */ -/* Updated: 2017/02/04 15:37:55 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 16:59:46 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "minishell.h" +/* #include "minishell.h" */ -static void ft_read_it_3(char **str, char t[5], size_t *pos, int *j) -{ - int i; +/* static void ft_read_it_3(char **str, char t[5], size_t *pos, int *j) */ +/* { */ +/* int i; */ - i = 0; - while (i < 4 && t[i] == '\0') - ++i; - while (i < 4) - { - if (t[i] && ft_isprint(t[i])) - { - *str = ft_realloc_imput(*str, t[i], *pos); - ++(*pos); - ++(*j); - } - ++i; - } -} +/* i = 0; */ +/* while (i < 4 && t[i] == '\0') */ +/* ++i; */ +/* while (i < 4) */ +/* { */ +/* if (t[i] && ft_isprint(t[i])) */ +/* { */ +/* *str = ft_realloc_imput(*str, t[i], *pos); */ +/* ++(*pos); */ +/* ++(*j); */ +/* } */ +/* ++i; */ +/* } */ +/* } */ -static void ft_read_it_2(int input, char t[5]) -{ - t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0'; - if (t[3]) - input = input % ft_pow(256, 3); - t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0'; - if (t[2]) - input = input % ft_pow(256, 2); - t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0'; - if (t[1]) - input = input % ft_pow(256, 1); - t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0'; - if (t[0]) - input = input % ft_pow(256, 0); - t[4] = '\0'; -} +/* static void ft_read_it_2(int input, char t[5]) */ +/* { */ +/* t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0'; */ +/* if (t[3]) */ +/* input = input % ft_pow(256, 3); */ +/* t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0'; */ +/* if (t[2]) */ +/* input = input % ft_pow(256, 2); */ +/* t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0'; */ +/* if (t[1]) */ +/* input = input % ft_pow(256, 1); */ +/* t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0'; */ +/* if (t[0]) */ +/* input = input % ft_pow(256, 0); */ +/* t[4] = '\0'; */ +/* } */ -void ft_read_it(int input, size_t *pos, char **str) -{ - int j; - char t[5]; - size_t pos_tmp; +/* 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 || input == - 942758683 || input == 993090331 || input == 18489 || input == 17977) - return ; - ft_read_it_2(input, t); - ft_read_it_3(str, t, pos, &j); - *pos = pos_tmp; - ft_current_str((*str), *pos); - ft_get_next_str((*str), pos); - ft_putnc('\b', *pos - (pos_tmp + j)); - *pos = (pos_tmp + j); -} +/* 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 || input == */ +/* 942758683 || input == 993090331 || input == 18489 || input == 17977) */ +/* return ; */ +/* ft_read_it_2(input, t); */ +/* ft_read_it_3(str, t, pos, &j); */ +/* *pos = pos_tmp; */ +/* ft_current_str((*str), *pos); */ +/* ft_get_next_str((*str), pos); */ +/* ft_putnc('\b', *pos - (pos_tmp + j)); */ +/* *pos = (pos_tmp + j); */ +/* } */ diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index efca1222..6a5079ac 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/04 16:19:36 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 17:03:16 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,11 +42,11 @@ void ft_init_history(void) close(fd); } -struct termios *ft_save_stats_term(void) +struct termios *ft_save_stats_term(int save) { static struct termios *term_save = NULL; - if (!term_save) + if (save) { term_save = (struct termios *)malloc(sizeof(struct termios)); tcgetattr(0, term_save); @@ -71,29 +71,32 @@ struct termios *ft_stats_term_termcaps(void) return (term); } -int ft_readline(void) +char *readline(char *prompt) { - ft_save_stats_term(); + char *input; + + ft_save_stats_term(1); if (tcsetattr(0, TCSANOW, ft_stats_term_termcaps()) == -1) - return (-1); + return (NULL); if (STR) ft_strdel(&STR); data_singleton()->line.list_cur = data_singleton()->line.list_beg; POS = 0; - ft_prompt(); - STR = ft_read_stdin(); - ft_check_line(); + prompt ? ft_putstr(prompt) : ft_prompt(); + input = ft_read_stdin(); ft_putchar('\n'); - ft_check_heredoc(&STR); - ft_history_parsing(); - if (STR && (!data_singleton()->line.list_beg || - ft_strcmp(data_singleton()->line.list_beg->prev->str, STR))) - { - ft_push_back_history(&data_singleton()->line.list_beg, - ft_create_history_list(STR)); - ft_add_in_history_file(STR); - } - if (tcsetattr(0, TCSANOW, ft_save_stats_term()) == -1) - return (-1); - return (0); + /* ft_check_line(); */ + /* ft_check_heredoc(&STR); */ + if (tcsetattr(0, TCSANOW, ft_save_stats_term(0)) == -1) + return (NULL); + return (input); + + /* ft_history_parsing(); */ + /* if (STR && (!data_singleton()->line.list_beg || */ + /* ft_strcmp(data_singleton()->line.list_beg->prev->str, STR))) */ + /* { */ + /* ft_push_back_history(&data_singleton()->line.list_beg, */ + /* ft_create_history_list(STR)); */ + /* ft_add_in_history_file(STR); */ + /* } */ } diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index b9cc077b..4cdf0625 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,25 +6,32 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:18:21 by jhalford ### ########.fr */ +/* Updated: 2017/02/10 00:36:05 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int shell_single_command(char *command) +int interactive_shell() { t_list *token; + t_list *ltoken; + t_lexer lexer; t_btree *ast; + lexer.pos = 0; + lexer.state = DEFAULT; + lexer.str = NULL; token = NULL; - ast = NULL; - - DG("{inv}{mag}got command '%s'", command); - if (ft_lexer(&token, &command) || !token) - return (1); - - token_print(token); + lexer.stack = NULL; + do { + if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH) + pop(&lexer.stack); + ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack))); + ltoken = ft_lstlast(token); + lexer_lex((token ? <oken : &token), &lexer); + token_print(token); + } while (lexer.stack->content); if (ft_parse(&ast, &token)) return (1); @@ -40,20 +47,12 @@ int main(int ac, char **av) data = data_singleton(); setlocale(LC_ALL, ""); - DG("{inv}{bol}{gre}start of shell{eoc} pid=%i pgrp=%i job_control is %s", getpid(), getpgrp(), SH_HAS_JOBC(data->opts) ? "ON" : "OFF"); shell_init(ac, av); DG("{inv}{bol}{gre}start of shell{eoc} pid=%i pgrp=%i job_control is %s", getpid(), getpgrp(), SH_HAS_JOBC(data->opts) ? "ON" : "OFF"); - if (data_singleton()->opts & SH_OPTS_LC) + if (SH_IS_INTERACTIVE(data->opts)) { - shell_single_command(ft_strdup(shell_get_avdata())); - return (0); - } - while (1) - { - if (ft_readline()) - return (1); - if (shell_single_command(ft_strdup(data_singleton()->line.input)) < 0) - return (1); + while (1) + interactive_shell(); } return (0); } diff --git a/42sh/src/main/remove_trailing_esc_nl.c b/42sh/src/main/remove_trailing_esc_nl.c new file mode 100644 index 00000000..9d6fb232 --- /dev/null +++ b/42sh/src/main/remove_trailing_esc_nl.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* remove_trailing_esc_nl.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 16:52:34 by jhalford #+# #+# */ +/* Updated: 2017/02/09 17:00:33 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int remove_trailing_esc_nl(char *str) +{ + char *last; + + last = str + ft_strlen(str) - 1; + if (*last == '\\') + { + *last = 0; + return (1); + } + return (0); +} diff --git a/42sh/src/main/shell_get_opts.c b/42sh/src/main/shell_get_opts.c index f9f861fc..86ce3c8e 100644 --- a/42sh/src/main/shell_get_opts.c +++ b/42sh/src/main/shell_get_opts.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 14:04:48 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:14:35 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 20:50:08 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,6 +29,7 @@ static void shell_parse_short_opt(char *str) { data_singleton()->opts |= SH_OPTS_LC; data_singleton()->opts &= ~SH_OPTS_JOBC; + data_singleton()->opts &= ~SH_INTERACTIVE; } i++; } From 6ec9f9295ea54a70e84cc375c3aaef245e79337e Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Fri, 10 Feb 2017 05:19:26 +0100 Subject: [PATCH 02/10] initial implementation looks ok, parenthesis needs fix --- 42sh/Makefile | 3 +- 42sh/includes/lexer.h | 13 ++-- 42sh/src/lexer/ft_post_tokenize.c | 40 ----------- 42sh/src/lexer/get_state_global.c | 2 +- 42sh/src/lexer/lexer_bquote.c | 14 ++-- 42sh/src/lexer/lexer_default.c | 19 ++---- 42sh/src/lexer/lexer_delim.c | 6 +- 42sh/src/lexer/lexer_dquote.c | 20 +++--- 42sh/src/lexer/lexer_lex.c | 2 +- 42sh/src/lexer/lexer_paren.c | 31 +++++++++ 42sh/src/lexer/lexer_quote.c | 16 +++-- 42sh/src/lexer/lexer_subshell.c | 37 ---------- 42sh/src/lexer/lexer_word.c | 5 +- 42sh/src/lexer/stack_to_prompt.c | 12 ++-- 42sh/src/line-editing/get_touch.c | 4 +- 42sh/src/line-editing/reader.c | 108 +++++++++++++++--------------- 42sh/src/main/main.c | 7 +- 17 files changed, 150 insertions(+), 189 deletions(-) delete mode 100644 42sh/src/lexer/ft_post_tokenize.c create mode 100644 42sh/src/lexer/lexer_paren.c delete mode 100644 42sh/src/lexer/lexer_subshell.c diff --git a/42sh/Makefile b/42sh/Makefile index d09f5200..0a38131a 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -137,7 +137,6 @@ job-control/sigtstp_handler.c\ job-control/sigttin_handler.c\ job-control/sigttou_handler.c\ lexer/command_getoutput.c\ -lexer/ft_post_tokenize.c\ lexer/get_state_global.c\ lexer/get_state_redir.c\ lexer/lexer_backslash.c\ @@ -153,9 +152,9 @@ lexer/lexer_lessand.c\ lexer/lexer_lex.c\ lexer/lexer_newline.c\ lexer/lexer_number.c\ +lexer/lexer_paren.c\ lexer/lexer_quote.c\ lexer/lexer_sep.c\ -lexer/lexer_subshell.c\ lexer/lexer_word.c\ lexer/reduce_bquotes.c\ lexer/reduce_parens.c\ diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index b9f11bde..14d04d60 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -31,14 +31,15 @@ # define TK_PAREN_OPEN (1 << 11) # define TK_PAREN_CLOSE (1 << 12) # define TK_BQUOTE (1 << 13) -# define TK_N_WORD (1 << 14) -# define TK_Q_WORD (1 << 15) -# define TK_DQ_WORD (1 << 16) +# define TK_WORD (1 << 14) +/* # define TK_N_WORD (1 << 14) */ +/* # define TK_Q_WORD (1 << 15) */ +/* # define TK_DQ_WORD (1 << 16) */ # define TK_COMMAND (1 << 17) # define TK_SUBSHELL (1 << 18) # define TK_NEWLINE (1 << 19) -# define TK_WORD (TK_N_WORD | TK_Q_WORD | TK_DQ_WORD) +/* # define TK_WORD (TK_N_WORD | TK_Q_WORD | TK_DQ_WORD) */ # define TK_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) # define TK_NON_FREEABLE (TK_PAREN_OPEN | TK_PAREN_CLOSE | TK_BQUOTE) @@ -58,7 +59,7 @@ enum e_lexstate DQUOTE, BQUOTE, BACKSLASH, - SUBSHELL, + PAREN, COMMENT, }; @@ -116,7 +117,7 @@ int lexer_quote(t_list **alst, t_lexer *lexer); int lexer_dquote(t_list **alst, t_lexer *lexer); int lexer_bquote(t_list **alst, t_lexer *lexer); int lexer_backslash(t_list **alst, t_lexer *lexer); -int lexer_subshell(t_list **alst, t_lexer *lexer); +int lexer_paren(t_list **alst, t_lexer *lexer); int lexer_comment(t_list **alst, t_lexer *lexer); #endif diff --git a/42sh/src/lexer/ft_post_tokenize.c b/42sh/src/lexer/ft_post_tokenize.c deleted file mode 100644 index a0b4941f..00000000 --- a/42sh/src/lexer/ft_post_tokenize.c +++ /dev/null @@ -1,40 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_post_tokenize.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/11 16:11:11 by jhalford #+# #+# */ -/* Updated: 2017/02/06 14:33:34 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "lexer.h" - -int ft_post_tokenize(t_list **alst, char **str) -{ - int ret; - t_flag tk; - - while ((ret = reduce_parens(alst, *str))) - if (ret == -1) - { - ft_dprintf(2, "{red}%s: parse error near '('{eoc}\n", SHELL_NAME); - return (-1); - } - tk = TK_PAREN_CLOSE; - if (ft_lst_find(*alst, &tk, token_cmp_type)) - { - ft_dprintf(2, "{red}%s: parse error near ')'{eoc}\n", SHELL_NAME); - return (-1); - } - while ((ret = reduce_bquotes(alst, str))) - if (ret == -1) - { - ft_dprintf(2, "{red}%s: parse error near '`'{eoc}\n", SHELL_NAME); - return (-1); - } - DG("new command from bquotes: '%s'", *str); - return (0); -} diff --git a/42sh/src/lexer/get_state_global.c b/42sh/src/lexer/get_state_global.c index 3f59ab73..bed48d83 100644 --- a/42sh/src/lexer/get_state_global.c +++ b/42sh/src/lexer/get_state_global.c @@ -32,6 +32,6 @@ t_lexstate get_state_global(t_lexer *lexer) else if (c == '`') return (BQUOTE); else if (c == '(' || c == ')') - return (SUBSHELL); + return (PAREN); return (0); } diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index a9e32dda..af4020b7 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -17,19 +17,21 @@ int lexer_bquote(t_list **alst, t_lexer *lexer) t_token *token; token = (*alst)->content; - token->type = TK_Q_WORD; - lexer->pos++; - push(&lexer->stack, BQUOTE); + token->type = TK_WORD; if (lexer->str[lexer->pos] == '`') { - lexer->state = WORD; lexer->pos++; + if (!(lexer->stack && *(int*)lexer->stack->content == BQUOTE)) + { + push(&lexer->stack, BQUOTE); + return (lexer_lex(alst, lexer)); + } + lexer->state = WORD; pop(&lexer->stack); return (lexer_lex(alst, lexer)); } - else if (lexer->str[lexer->pos] == 0) - return (0); token_append(token, lexer, 0, 0); + lexer->pos++; return (lexer_quote(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_default.c b/42sh/src/lexer/lexer_default.c index ed43b9d6..777d6f11 100644 --- a/42sh/src/lexer/lexer_default.c +++ b/42sh/src/lexer/lexer_default.c @@ -14,27 +14,16 @@ int lexer_default(t_list **alst, t_lexer *lexer) { - t_lexstate state; t_token *token; char c; c = lexer->str[lexer->pos]; - if ((state = get_state_global(lexer))) - { - lexer->state = state; + if ((lexer->state = get_state_global(lexer))) return (lexer_lex(alst, lexer)); - } - if ((state = get_state_redir(lexer))) - { - lexer->state = state; + if ((lexer->state = get_state_redir(lexer))) return (lexer_lex(alst, lexer)); - } - else if (ft_isdigit(c)) - lexer->state = NUMBER; - else - lexer->state = WORD; + lexer->state = ft_isdigit(c) ? NUMBER : WORD; token = (*alst)->content; - token_append(token, lexer, 0, 0); - token->type = TK_N_WORD; + token->type = TK_WORD; return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_delim.c b/42sh/src/lexer/lexer_delim.c index 6fa29b29..a30dd955 100644 --- a/42sh/src/lexer/lexer_delim.c +++ b/42sh/src/lexer/lexer_delim.c @@ -17,13 +17,17 @@ int lexer_delim(t_list **alst, t_lexer *lexer) t_token *token; token = (*alst)->content; + DG("DELIM"); while (ft_is_delim(lexer->str[lexer->pos])) lexer->pos++; + lexer->state = DEFAULT; if (token->type) + { return (lexer_lex(&(*alst)->next, lexer)); + } else { - if (!lexer->str[lexer->pos]) + if (lexer->str[lexer->pos] == 0) ft_lst_delif(alst, (*alst)->content, &ft_addrcmp, &token_free); return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 7077fd7b..68157512 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -17,18 +17,20 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) t_token *token; token = (*alst)->content; - token->type = TK_DQ_WORD; - if (*(int*)lexer->stack->content != DQUOTE) - push(&lexer->stack, DQUOTE); - lexer->pos++; + token->type = TK_WORD; if (lexer->str[lexer->pos] == '"') { lexer->pos++; + if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE)) + { + push(&lexer->stack, DQUOTE); + return (lexer_lex(alst, lexer)); + } lexer->state = WORD; pop(&lexer->stack); return (lexer_lex(alst, lexer)); } - else if (lexer->str[lexer->pos] == '\\') + if (lexer->str[lexer->pos] == '\\') { if (lexer->str[lexer->pos + 1] == '"') token_append(token, lexer, 1, 0); @@ -42,9 +44,11 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) return (lexer_dquote(alst,lexer)); } else if (lexer->str[lexer->pos] == '`') + { + lexer->state = BQUOTE; lexer_bquote(alst, lexer); - else if (lexer->str[lexer->pos] == 0) - return (0); + } token_append(token, lexer, 1, 0); - return (lexer_dquote(alst, lexer)); + lexer->pos++; + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_lex.c b/42sh/src/lexer/lexer_lex.c index a406fbc8..054b03d9 100644 --- a/42sh/src/lexer/lexer_lex.c +++ b/42sh/src/lexer/lexer_lex.c @@ -28,7 +28,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) = &lexer_dquote, &lexer_bquote, &lexer_backslash, - &lexer_subshell, + &lexer_paren, &lexer_comment, }; diff --git a/42sh/src/lexer/lexer_paren.c b/42sh/src/lexer/lexer_paren.c new file mode 100644 index 00000000..dd795357 --- /dev/null +++ b/42sh/src/lexer/lexer_paren.c @@ -0,0 +1,31 @@ +#include "lexer.h" + +int lexer_paren(t_list **alst, t_lexer *lexer) +{ + t_token *token; + t_list **lst; + + lst = alst; + if (*alst) + { + token = (*alst)->content; + if (token->type) + lst = &(*alst)->next; + } + token = token_init(); + *lst = ft_lstnew(token, sizeof(*token)); + token = (*lst)->content; + if (lexer->str[lexer->pos] == '(') + { + token->type = TK_PAREN_OPEN; + push(&lexer->stack, PAREN); + } + else if (lexer->stack && *(int*)lexer->stack->content == PAREN) + { + token->type = TK_PAREN_CLOSE; + pop(&lexer->stack); + } + lexer->pos++; + lexer->state = DEFAULT; + return (lexer_lex(&(*lst)->next, lexer)); +} diff --git a/42sh/src/lexer/lexer_quote.c b/42sh/src/lexer/lexer_quote.c index b0764b7d..2d3a6432 100644 --- a/42sh/src/lexer/lexer_quote.c +++ b/42sh/src/lexer/lexer_quote.c @@ -17,18 +17,20 @@ int lexer_quote(t_list **alst, t_lexer *lexer) t_token *token; token = (*alst)->content; - token->type = TK_Q_WORD; - lexer->pos++; - push(&lexer->stack, QUOTE); + token->type = TK_WORD; if (lexer->str[lexer->pos] == '\'') { - lexer->state = WORD; lexer->pos++; + if (!(lexer->stack && *(int*)lexer->stack->content == QUOTE)) + { + push(&lexer->stack, QUOTE); + return (lexer_lex(alst, lexer)); + } + lexer->state = WORD; pop(&lexer->stack); return (lexer_lex(alst, lexer)); } - else if (lexer->str[lexer->pos] == 0) - return (0); token_append(token, lexer, 1, 1); - return (lexer_quote(alst, lexer)); + lexer->pos++; + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_subshell.c b/42sh/src/lexer/lexer_subshell.c deleted file mode 100644 index 278849bb..00000000 --- a/42sh/src/lexer/lexer_subshell.c +++ /dev/null @@ -1,37 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* lexer_special.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/11 15:35:38 by jhalford #+# #+# */ -/* Updated: 2017/02/09 22:09:07 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "lexer.h" - -int lexer_subshell(t_list **alst, t_lexer *lexer) -{ - t_token *token; - t_list **lst; - - lst = alst; - if (*alst) - { - token = (*alst)->content; - if (token->type) - lst = &(*alst)->next; - } - token = token_init(); - *lst = ft_lstnew(token, sizeof(*token)); - token = (*lst)->content; - if (lexer->str[lexer->pos] == '(') - token->type = TK_PAREN_OPEN; - else if (lexer->str[lexer->pos] == ')') - token->type = TK_PAREN_CLOSE; - token->data = lexer->str; - lexer->pos++; - return (lexer_lex(&(*lst)->next, lexer)); -} diff --git a/42sh/src/lexer/lexer_word.c b/42sh/src/lexer/lexer_word.c index b5fa0ae9..599b2ac7 100644 --- a/42sh/src/lexer/lexer_word.c +++ b/42sh/src/lexer/lexer_word.c @@ -18,9 +18,12 @@ int lexer_word(t_list **alst, t_lexer *lexer) t_lexstate state; token = (*alst)->content; - token->type = TK_N_WORD; + token->type = TK_WORD; if ((state = get_state_global(lexer))) + { + lexer->state = state; return (lexer_lex(alst, lexer)); + } if ((state = get_state_redir(lexer))) { lexer->state = state; diff --git a/42sh/src/lexer/stack_to_prompt.c b/42sh/src/lexer/stack_to_prompt.c index 0343dcb2..35d83a5c 100644 --- a/42sh/src/lexer/stack_to_prompt.c +++ b/42sh/src/lexer/stack_to_prompt.c @@ -22,13 +22,13 @@ char *stack_to_prompt(t_list *stack) if (top == BACKSLASH) return ("> "); else if (top == QUOTE) - return ("quote >"); + return ("quote> "); else if (top == DQUOTE) - return ("dquote >"); + return ("dquote> "); else if (top == BQUOTE) - return ("bquote >"); - else if (top == SUBSHELL) - return ("subsh >"); + return ("bquote> "); + else if (top == PAREN) + return ("subsh> "); else - return (" > "); + return ("error> "); } diff --git a/42sh/src/line-editing/get_touch.c b/42sh/src/line-editing/get_touch.c index 71c31e85..7c90314c 100644 --- a/42sh/src/line-editing/get_touch.c +++ b/42sh/src/line-editing/get_touch.c @@ -71,7 +71,7 @@ char *ft_read_stdin(void) ft_print(ret); else if (ret == 10) return (STR); - /* else if (ft_isascii(ret) == 0) */ - /* ft_read_it(ret, &POS, &STR); */ + else if (ft_isascii(ret) == 0) + ft_read_it(ret, &POS, &STR); } } diff --git a/42sh/src/line-editing/reader.c b/42sh/src/line-editing/reader.c index 3068e52d..6d58ce23 100644 --- a/42sh/src/line-editing/reader.c +++ b/42sh/src/line-editing/reader.c @@ -10,62 +10,62 @@ /* */ /* ************************************************************************** */ -/* #include "minishell.h" */ +#include "minishell.h" -/* static void ft_read_it_3(char **str, char t[5], size_t *pos, int *j) */ -/* { */ -/* int i; */ +static void ft_read_it_3(char **str, char t[5], size_t *pos, int *j) +{ + int i; -/* i = 0; */ -/* while (i < 4 && t[i] == '\0') */ -/* ++i; */ -/* while (i < 4) */ -/* { */ -/* if (t[i] && ft_isprint(t[i])) */ -/* { */ -/* *str = ft_realloc_imput(*str, t[i], *pos); */ -/* ++(*pos); */ -/* ++(*j); */ -/* } */ -/* ++i; */ -/* } */ -/* } */ + i = 0; + while (i < 4 && t[i] == '\0') + ++i; + while (i < 4) + { + if (t[i] && ft_isprint(t[i])) + { + *str = ft_realloc_imput(*str, t[i], *pos); + ++(*pos); + ++(*j); + } + ++i; + } +} -/* static void ft_read_it_2(int input, char t[5]) */ -/* { */ -/* t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0'; */ -/* if (t[3]) */ -/* input = input % ft_pow(256, 3); */ -/* t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0'; */ -/* if (t[2]) */ -/* input = input % ft_pow(256, 2); */ -/* t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0'; */ -/* if (t[1]) */ -/* input = input % ft_pow(256, 1); */ -/* t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0'; */ -/* if (t[0]) */ -/* input = input % ft_pow(256, 0); */ -/* t[4] = '\0'; */ -/* } */ +static void ft_read_it_2(int input, char t[5]) +{ + t[3] = (input / ft_pow(256, 3)) ? (input / ft_pow(256, 3)) : '\0'; + if (t[3]) + input = input % ft_pow(256, 3); + t[2] = (input / ft_pow(256, 2)) ? (input / ft_pow(256, 2)) : '\0'; + if (t[2]) + input = input % ft_pow(256, 2); + t[1] = (input / ft_pow(256, 1)) ? (input / ft_pow(256, 1)) : '\0'; + if (t[1]) + input = input % ft_pow(256, 1); + t[0] = (input / ft_pow(256, 0)) ? (input / ft_pow(256, 0)) : '\0'; + if (t[0]) + input = input % ft_pow(256, 0); + t[4] = '\0'; +} -/* void ft_read_it(int input, size_t *pos, char **str) */ -/* { */ -/* int j; */ -/* char t[5]; */ -/* size_t pos_tmp; */ +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 || input == */ -/* 942758683 || input == 993090331 || input == 18489 || input == 17977) */ -/* return ; */ -/* ft_read_it_2(input, t); */ -/* ft_read_it_3(str, t, pos, &j); */ -/* *pos = pos_tmp; */ -/* ft_current_str((*str), *pos); */ -/* ft_get_next_str((*str), pos); */ -/* ft_putnc('\b', *pos - (pos_tmp + j)); */ -/* *pos = (pos_tmp + j); */ -/* } */ + 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 || input == + 942758683 || input == 993090331 || input == 18489 || input == 17977) + return ; + ft_read_it_2(input, t); + ft_read_it_3(str, t, pos, &j); + *pos = pos_tmp; + ft_current_str((*str), *pos); + ft_get_next_str((*str), pos); + ft_putnc('\b', *pos - (pos_tmp + j)); + *pos = (pos_tmp + j); +} diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 4cdf0625..a847c100 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -24,17 +24,20 @@ int interactive_shell() lexer.str = NULL; token = NULL; lexer.stack = NULL; + ast = NULL; do { if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH) pop(&lexer.stack); ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack))); + DG("[{mag}%s{eoc}]", lexer.str); ltoken = ft_lstlast(token); lexer_lex((token ? <oken : &token), &lexer); token_print(token); - } while (lexer.stack->content); + } while (lexer.stack); + DG("after lexing"); + token_print(token); if (ft_parse(&ast, &token)) return (1); - btree_print(STDBUG, ast, &ft_putast); if (ft_exec(&ast)) return (1); From 1167a23ca3c29588b2c839a2353b79fde4dbd800 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Fri, 10 Feb 2017 05:30:17 +0100 Subject: [PATCH 03/10] some refactoring of readline.c --- 42sh/src/line-editing/readline.c | 46 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index 6a5079ac..ba2e6498 100644 --- a/42sh/src/line-editing/readline.c +++ b/42sh/src/line-editing/readline.c @@ -42,7 +42,7 @@ void ft_init_history(void) close(fd); } -struct termios *ft_save_stats_term(int save) +struct termios *ft_save_termios(int save) { static struct termios *term_save = NULL; @@ -54,40 +54,40 @@ struct termios *ft_save_stats_term(int save) return (term_save); } -struct termios *ft_stats_term_termcaps(void) +void ft_init_termios(void) { - static struct termios *term = NULL; + struct termios term; - if (!term) - { - ft_init_line(); - ft_init_history(); - term = (struct termios *)malloc(sizeof(struct termios)); - tcgetattr(0, term); - (*term).c_lflag &= ~(ECHO | ICANON | ISIG); - (*term).c_cc[VMIN] = 1; - (*term).c_cc[VTIME] = 0; - } - return (term); + tcgetattr(0, &term); + term.c_lflag &= ~(ECHO | ICANON | ISIG); + term.c_cc[VMIN] = 1; + term.c_cc[VTIME] = 0; + tcsetattr(0, TCSANOW, &term); +} + +void readline_init(char *prompt) +{ + ft_save_termios(1); + ft_init_line(); + ft_init_history(); + ft_init_termios(); + if (STR) + ft_strdel(&STR); + data_singleton()->line.list_cur = data_singleton()->line.list_beg; + POS = 0; + prompt ? ft_putstr(prompt) : ft_prompt(); } char *readline(char *prompt) { char *input; - ft_save_stats_term(1); - if (tcsetattr(0, TCSANOW, ft_stats_term_termcaps()) == -1) - return (NULL); - if (STR) - ft_strdel(&STR); - data_singleton()->line.list_cur = data_singleton()->line.list_beg; - POS = 0; - prompt ? ft_putstr(prompt) : ft_prompt(); + readline_init(prompt); input = ft_read_stdin(); ft_putchar('\n'); /* ft_check_line(); */ /* ft_check_heredoc(&STR); */ - if (tcsetattr(0, TCSANOW, ft_save_stats_term(0)) == -1) + if (tcsetattr(0, TCSANOW, ft_save_termios(0)) == -1) return (NULL); return (input); From b25e6b186a79111e7cf56f26994fb2d7ddcb15a7 Mon Sep 17 00:00:00 2001 From: gwojda Date: Fri, 10 Feb 2017 12:19:51 +0100 Subject: [PATCH 04/10] fixe termcaps --- 42sh/src/glob/lib_perso/ft_memrealloc.c | 6 +++--- 42sh/src/main/data_init.c | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/42sh/src/glob/lib_perso/ft_memrealloc.c b/42sh/src/glob/lib_perso/ft_memrealloc.c index 08130733..4f3c6125 100644 --- a/42sh/src/glob/lib_perso/ft_memrealloc.c +++ b/42sh/src/glob/lib_perso/ft_memrealloc.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_memrealloc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: wescande +#+ +:+ +#+ */ +/* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/05 13:44:36 by wescande #+# #+# */ -/* Updated: 2017/02/08 13:54:33 by wescande ### ########.fr */ +/* Updated: 2017/02/10 12:13:23 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,6 +25,6 @@ void *ft_memrealloc(void *ptr, size_t old_s, size_t new_s) } n_ptr = ft_memalloc(new_s); ft_memcpy(n_ptr, ptr, old_s); - ft_memdel(ptr); + ft_memdel(&ptr); return (n_ptr); } diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index 8c11688e..9127da80 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:23:02 by jhalford ### ########.fr */ +/* Updated: 2017/02/10 12:16:32 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ extern char **environ; int data_init(void) { t_data *data; + char *term_name; data = data_singleton(); data->env = ft_sstrdup(environ); @@ -44,5 +45,9 @@ int data_init(void) data->jobc.first_job = NULL; data->jobc.current_id = 1; + if ((term_name = ft_getenv(data->env, "TERM")) == NULL) + return (-1); + if (tgetent(NULL, term_name) != 1) + return (-1); return (0); } From 0a1fd7e5186118e8aab6637fcd1c042be325c062 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Fri, 10 Feb 2017 13:38:49 +0100 Subject: [PATCH 05/10] dquotes->bquotes --- 42sh/includes/lexer.h | 1 + 42sh/src/lexer/lexer_bquote.c | 14 ++++++++------ 42sh/src/lexer/lexer_dquote.c | 5 +++-- 42sh/src/lexer/lexer_lex.c | 1 + 42sh/src/lexer/stack_to_prompt.c | 2 ++ 42sh/src/lexer/token_append.c | 6 +++--- 42sh/src/lexer/token_print.c | 2 +- 42sh/src/main/data_init.c | 3 ++- 42sh/src/main/main.c | 2 +- 9 files changed, 22 insertions(+), 14 deletions(-) diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 14d04d60..f0405871 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -58,6 +58,7 @@ enum e_lexstate QUOTE, DQUOTE, BQUOTE, + DQUOTE_BQUOTE, BACKSLASH, PAREN, COMMENT, diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index af4020b7..e4c003ad 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -15,23 +15,25 @@ int lexer_bquote(t_list **alst, t_lexer *lexer) { t_token *token; + int top_state; token = (*alst)->content; token->type = TK_WORD; + token_append(token, lexer, 0, 0); if (lexer->str[lexer->pos] == '`') { lexer->pos++; - if (!(lexer->stack && *(int*)lexer->stack->content == BQUOTE)) + if (!(lexer->stack && (*(int*)lexer->stack->content == BQUOTE + || *(int*)lexer->stack->content == DQUOTE_BQUOTE))) { - push(&lexer->stack, BQUOTE); + push(&lexer->stack, lexer->state); return (lexer_lex(alst, lexer)); } - lexer->state = WORD; - pop(&lexer->stack); + top_state = *(int*)pop(&lexer->stack); + lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT; return (lexer_lex(alst, lexer)); } - token_append(token, lexer, 0, 0); lexer->pos++; - return (lexer_quote(alst, lexer)); + return (lexer_lex(alst, lexer)); } diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 68157512..36399c62 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -21,6 +21,7 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) if (lexer->str[lexer->pos] == '"') { lexer->pos++; + /* if (!(lexer->stack && *(int*)lexer->stack->content != BQUOTE)) */ if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE)) { push(&lexer->stack, DQUOTE); @@ -45,8 +46,8 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) } else if (lexer->str[lexer->pos] == '`') { - lexer->state = BQUOTE; - lexer_bquote(alst, lexer); + lexer->state = DQUOTE_BQUOTE; + return (lexer_bquote(alst, lexer)); } token_append(token, lexer, 1, 0); lexer->pos++; diff --git a/42sh/src/lexer/lexer_lex.c b/42sh/src/lexer/lexer_lex.c index 054b03d9..1e9f4a03 100644 --- a/42sh/src/lexer/lexer_lex.c +++ b/42sh/src/lexer/lexer_lex.c @@ -27,6 +27,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) = &lexer_quote, &lexer_dquote, &lexer_bquote, + &lexer_bquote, &lexer_backslash, &lexer_paren, &lexer_comment, diff --git a/42sh/src/lexer/stack_to_prompt.c b/42sh/src/lexer/stack_to_prompt.c index 35d83a5c..385ffc89 100644 --- a/42sh/src/lexer/stack_to_prompt.c +++ b/42sh/src/lexer/stack_to_prompt.c @@ -27,6 +27,8 @@ char *stack_to_prompt(t_list *stack) return ("dquote> "); else if (top == BQUOTE) return ("bquote> "); + else if (top == DQUOTE_BQUOTE) + return ("dquote bquote> "); else if (top == PAREN) return ("subsh> "); else diff --git a/42sh/src/lexer/token_append.c b/42sh/src/lexer/token_append.c index b2b00fb3..1b82a8d3 100644 --- a/42sh/src/lexer/token_append.c +++ b/42sh/src/lexer/token_append.c @@ -26,13 +26,13 @@ int token_append(t_token *token, t_lexer *lexer, short int esc, short int esc2) token->esc = (unsigned char *)ft_memrealloc((char *)token->esc, (token->size >> 3), (token->size >> 3) + 1); - token->esc[token->size >> 3] = 0; + token->esc[token->size >> 3] = 0; token->esc2 = (unsigned char *)ft_memrealloc((char *)token->esc2, (token->size >> 3), (token->size >> 3) + 1); - token->esc2[token->size >> 3] = 0; + token->esc2[token->size >> 3] = 0; } - ft_strcat(token->data, (char[2]){c, '\0'}); + ft_strcat(token->data, (char[]){c, 0}); token->esc[len >> 3] |= esc << (7 - len % 8); token->esc2[len >> 3] |= esc2 << (7 - len % 8); return (0); diff --git a/42sh/src/lexer/token_print.c b/42sh/src/lexer/token_print.c index cc644557..7f102fa2 100644 --- a/42sh/src/lexer/token_print.c +++ b/42sh/src/lexer/token_print.c @@ -26,7 +26,7 @@ void token_print(t_list *lst) type = token->type; while (type >> (i++ + 2)) ; - DG("%02i '%s'", i, token->data); + DG("%02i:[%s]", i, token->data); index = -1; lst = lst->next; } diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index 8c11688e..8892b426 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:23:02 by jhalford ### ########.fr */ +/* Updated: 2017/02/09 16:31:07 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ extern char **environ; int data_init(void) { t_data *data; + char *term_name; data = data_singleton(); data->env = ft_sstrdup(environ); diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index a847c100..df8b4f98 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -29,9 +29,9 @@ int interactive_shell() if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH) pop(&lexer.stack); ft_strappend(&lexer.str, readline(stack_to_prompt(lexer.stack))); - DG("[{mag}%s{eoc}]", lexer.str); ltoken = ft_lstlast(token); lexer_lex((token ? <oken : &token), &lexer); + DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state); token_print(token); } while (lexer.stack); DG("after lexing"); From f7ed0a6bdd0328d6e1f28a75b2263f0af5096c7d Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Fri, 10 Feb 2017 13:50:46 +0100 Subject: [PATCH 06/10] bq->dq seems to function --- 42sh/src/lexer/lexer_bquote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index e4c003ad..88dee442 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -29,7 +29,7 @@ int lexer_bquote(t_list **alst, t_lexer *lexer) push(&lexer->stack, lexer->state); return (lexer_lex(alst, lexer)); } - top_state = *(int*)pop(&lexer->stack); + top_state = *(int*)pop(&lexer->stack)->content; lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT; return (lexer_lex(alst, lexer)); } From 742a99440ea0d9d7076a4c7b9a840651612da521 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 12 Feb 2017 18:11:59 +0100 Subject: [PATCH 07/10] backslash should work, also keep NL when they are quoted --- 42sh/Makefile | 1 + 42sh/includes/lexer.h | 8 +++----- 42sh/src/lexer/get_state_global.c | 2 ++ 42sh/src/lexer/lexer_bquote.c | 14 +++++++++++++- 42sh/src/lexer/lexer_dquote.c | 11 +++++------ 42sh/src/lexer/lexer_end.c | 18 ++++++++++++++++++ 42sh/src/lexer/lexer_lex.c | 5 +++-- 42sh/src/main/main.c | 2 -- 8 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 42sh/src/lexer/lexer_end.c diff --git a/42sh/Makefile b/42sh/Makefile index 0a38131a..4e41b851 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -145,6 +145,7 @@ lexer/lexer_comment.c\ lexer/lexer_default.c\ lexer/lexer_delim.c\ lexer/lexer_dquote.c\ +lexer/lexer_end.c\ lexer/lexer_great.c\ lexer/lexer_greatand.c\ lexer/lexer_less.c\ diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index f0405871..3385e5b8 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -32,16 +32,12 @@ # define TK_PAREN_CLOSE (1 << 12) # define TK_BQUOTE (1 << 13) # define TK_WORD (1 << 14) -/* # define TK_N_WORD (1 << 14) */ -/* # define TK_Q_WORD (1 << 15) */ -/* # define TK_DQ_WORD (1 << 16) */ # define TK_COMMAND (1 << 17) # define TK_SUBSHELL (1 << 18) # define TK_NEWLINE (1 << 19) -/* # define TK_WORD (TK_N_WORD | TK_Q_WORD | TK_DQ_WORD) */ # define TK_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) -# define TK_NON_FREEABLE (TK_PAREN_OPEN | TK_PAREN_CLOSE | TK_BQUOTE) +# define TK_NON_FREEABLE (TK_BQUOTE) enum e_lexstate { @@ -62,6 +58,7 @@ enum e_lexstate BACKSLASH, PAREN, COMMENT, + END, }; struct s_token @@ -120,5 +117,6 @@ int lexer_bquote(t_list **alst, t_lexer *lexer); int lexer_backslash(t_list **alst, t_lexer *lexer); int lexer_paren(t_list **alst, t_lexer *lexer); int lexer_comment(t_list **alst, t_lexer *lexer); +int lexer_end(t_list **alst, t_lexer *lexer); #endif diff --git a/42sh/src/lexer/get_state_global.c b/42sh/src/lexer/get_state_global.c index bed48d83..38847ae2 100644 --- a/42sh/src/lexer/get_state_global.c +++ b/42sh/src/lexer/get_state_global.c @@ -33,5 +33,7 @@ t_lexstate get_state_global(t_lexer *lexer) return (BQUOTE); else if (c == '(' || c == ')') return (PAREN); + else if (c == 0) + return (END); return (0); } diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index 88dee442..0f961942 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -33,7 +33,19 @@ int lexer_bquote(t_list **alst, t_lexer *lexer) lexer->state = top_state == DQUOTE_BQUOTE ? DQUOTE : DEFAULT; return (lexer_lex(alst, lexer)); } + if (lexer->str[lexer->pos] == '\\') + { + lexer->pos++; + if (lexer->str[lexer->pos] == 0) + { + push(&lexer->stack, BACKSLASH); + return (0); + } + else + token_append(token, lexer, 1, 1); + lexer->pos++; + return (lexer_lex(alst,lexer)); + } lexer->pos++; return (lexer_lex(alst, lexer)); } - diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index 36399c62..1de82507 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -21,7 +21,6 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) if (lexer->str[lexer->pos] == '"') { lexer->pos++; - /* if (!(lexer->stack && *(int*)lexer->stack->content != BQUOTE)) */ if (!(lexer->stack && *(int*)lexer->stack->content == DQUOTE)) { push(&lexer->stack, DQUOTE); @@ -33,16 +32,16 @@ int lexer_dquote(t_list **alst, t_lexer *lexer) } if (lexer->str[lexer->pos] == '\\') { - if (lexer->str[lexer->pos + 1] == '"') - token_append(token, lexer, 1, 0); - else if (lexer->str[lexer->pos + 1] == 0) + lexer->pos++; + if (lexer->str[lexer->pos] == 0) { push(&lexer->stack, BACKSLASH); return (0); } + else + token_append(token, lexer, 1, 1); lexer->pos++; - token_append(token, lexer, 1, 1); - return (lexer_dquote(alst,lexer)); + return (lexer_lex(alst,lexer)); } else if (lexer->str[lexer->pos] == '`') { diff --git a/42sh/src/lexer/lexer_end.c b/42sh/src/lexer/lexer_end.c new file mode 100644 index 00000000..f635cb3d --- /dev/null +++ b/42sh/src/lexer/lexer_end.c @@ -0,0 +1,18 @@ +#include "lexer.h" + +int lexer_end(t_list **alst, t_lexer *lexer) +{ + t_token *token; + + token = (*alst)->content; + if (lexer->state == QUOTE + || lexer->state == DQUOTE + || lexer->state == BQUOTE) + { + ft_strappend(&lexer->str, (char[]){'\n', 0}); + token_append(token, lexer, 1, 0); + lexer->pos++; + return (0); + } + return (0); +} diff --git a/42sh/src/lexer/lexer_lex.c b/42sh/src/lexer/lexer_lex.c index 1e9f4a03..9472a565 100644 --- a/42sh/src/lexer/lexer_lex.c +++ b/42sh/src/lexer/lexer_lex.c @@ -31,6 +31,7 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) = &lexer_backslash, &lexer_paren, &lexer_comment, + &lexer_end, }; int ft_is_delim(char c) @@ -42,8 +43,8 @@ int lexer_lex(t_list **alst, t_lexer *lexer) { t_token *token; - if (!lexer->str[lexer->pos]) - return (0); + if (lexer->str[lexer->pos] == 0) + return (lexer_end(alst, lexer)); if (!*alst) { token = token_init(); diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index df8b4f98..3160048d 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -34,8 +34,6 @@ int interactive_shell() DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state); token_print(token); } while (lexer.stack); - DG("after lexing"); - token_print(token); if (ft_parse(&ast, &token)) return (1); btree_print(STDBUG, ast, &ft_putast); From 2e0b6102ce5ba62ce649285e9d1f424e406022c8 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Mon, 13 Feb 2017 15:31:21 +0100 Subject: [PATCH 08/10] bquotes expand correctly but segfault afterwards... --- 42sh/Makefile | 3 +- 42sh/includes/lexer.h | 13 ++--- 42sh/libft | 2 +- 42sh/src/lexer/command_getoutput.c | 2 +- 42sh/src/lexer/expand_bquotes.c | 79 ++++++++++++++++++++++++++++++ 42sh/src/lexer/reduce_bquotes.c | 57 --------------------- 42sh/src/lexer/token_expand_var.c | 29 ----------- 42sh/src/lexer/token_free.c | 9 ++-- 42sh/src/main/main.c | 36 ++++++++++++++ 42sh/src/main/shell_exit.c | 3 +- 10 files changed, 128 insertions(+), 105 deletions(-) create mode 100644 42sh/src/lexer/expand_bquotes.c delete mode 100644 42sh/src/lexer/reduce_bquotes.c delete mode 100644 42sh/src/lexer/token_expand_var.c diff --git a/42sh/Makefile b/42sh/Makefile index 4e41b851..5fa85765 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -137,6 +137,7 @@ job-control/sigtstp_handler.c\ job-control/sigttin_handler.c\ job-control/sigttou_handler.c\ lexer/command_getoutput.c\ +lexer/expand_bquotes.c\ lexer/get_state_global.c\ lexer/get_state_redir.c\ lexer/lexer_backslash.c\ @@ -157,12 +158,10 @@ lexer/lexer_paren.c\ lexer/lexer_quote.c\ lexer/lexer_sep.c\ lexer/lexer_word.c\ -lexer/reduce_bquotes.c\ lexer/reduce_parens.c\ lexer/stack_to_prompt.c\ lexer/token_append.c\ lexer/token_cmp_type.c\ -lexer/token_expand_var.c\ lexer/token_free.c\ lexer/token_init.c\ lexer/token_print.c\ diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 3385e5b8..3e9f37fd 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -30,14 +30,12 @@ # define TK_AMP (1 << 10) # define TK_PAREN_OPEN (1 << 11) # define TK_PAREN_CLOSE (1 << 12) -# define TK_BQUOTE (1 << 13) -# define TK_WORD (1 << 14) -# define TK_COMMAND (1 << 17) -# define TK_SUBSHELL (1 << 18) -# define TK_NEWLINE (1 << 19) +# define TK_WORD (1 << 13) +# define TK_COMMAND (1 << 14) +# define TK_SUBSHELL (1 << 15) +# define TK_NEWLINE (1 << 16) # define TK_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) -# define TK_NON_FREEABLE (TK_BQUOTE) enum e_lexstate { @@ -89,10 +87,9 @@ int token_append(t_token *token, t_lexer *lexer, void token_free(void *data, size_t size); int token_cmp_type(t_token *token, t_type *ref); void token_print(t_list *lst); -void token_expand_var(t_token *token); int reduce_parens(t_list **alst, char *str); -int reduce_bquotes(t_list **alst, char **str); +int expand_bquotes(t_list **alst); char *command_getoutput(char *command); int ft_is_delim(char c); diff --git a/42sh/libft b/42sh/libft index acd7e54f..d0ac53c6 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit acd7e54fb8045b3958dd239d469f1476404468b7 +Subproject commit d0ac53c68648106b8bafcc5ee8334306f6b0bc7e diff --git a/42sh/src/lexer/command_getoutput.c b/42sh/src/lexer/command_getoutput.c index 7dbd1c46..114216c8 100644 --- a/42sh/src/lexer/command_getoutput.c +++ b/42sh/src/lexer/command_getoutput.c @@ -34,7 +34,7 @@ char *command_getoutput(char *command) ast = btree_create_node(&item, sizeof(item)); pipe(fds); exec->process.fdout = fds[PIPE_WRITE]; - ft_exec(&ast); + exec_command(&ast); exec->process.fdout = STDOUT; close(fds[PIPE_WRITE]); while ((ret = read(fds[PIPE_READ], buf, BUF_SIZE))) diff --git a/42sh/src/lexer/expand_bquotes.c b/42sh/src/lexer/expand_bquotes.c new file mode 100644 index 00000000..9336761e --- /dev/null +++ b/42sh/src/lexer/expand_bquotes.c @@ -0,0 +1,79 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expand_bquotes.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */ +/* Updated: 2017/02/09 20:45:08 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "lexer.h" + +int expand_bquotes(t_list **alst) +{ + t_list *new_word; + t_list *after_word; + t_list *cur_word; + t_list *lst; + t_token *token; + t_token token_buf; + char *word; + char *output; + char *bq_start; + char *bq_end; + char *after_bq; + char **str; + t_flag tk; + + tk = TK_WORD; + cur_word = *alst; + while (cur_word && (lst = ft_lst_find(cur_word, &tk, token_cmp_type))) + { + cur_word = lst; + after_word = cur_word->next; + token = cur_word->content; + str = &token->data; + DG("found word=[%s]", *str); + if (!(bq_start = ft_strchr(*str, '`'))) + { + cur_word = cur_word->next; + continue ; + } + if (!(bq_end = ft_strchr(bq_start + 1, '`'))) + { + ft_dprintf(2, "{red}%s: parse error near '`'{eoc}\n", SHELL_NAME); + return (-1); + } + *bq_end = 0; + after_bq = ft_strdup(bq_end + 1); + output = command_getoutput(bq_start + 1); + word = ft_strtok(output, " \n\t"); + DG("strtok=[%s]", word); + DG("first_tok was [%s]", *str); + *bq_start = 0; + ft_strappend(str, word); + DG("first_tok=[%s]", *str); + while ((word = ft_strtok(NULL, " \n\t"))) + { + DG("strtok=[%s]", word); + token_buf.data = ft_strdup(word); + token_buf.type = TK_WORD; + new_word = ft_lstnew(&token_buf, sizeof(token_buf)); + cur_word->next = new_word; + new_word->next = after_word; + cur_word = new_word; + } + token = new_word->content; + ft_strappend(&token->data, after_bq); + ft_strdel(&after_bq); + ft_strdel(&output); + cur_word = after_word; + } + token_print(*alst); + DG("check end"); + return (0); +} + diff --git a/42sh/src/lexer/reduce_bquotes.c b/42sh/src/lexer/reduce_bquotes.c deleted file mode 100644 index f7c416de..00000000 --- a/42sh/src/lexer/reduce_bquotes.c +++ /dev/null @@ -1,57 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* reduce_bquotes.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:45:08 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "lexer.h" - -int reduce_bquotes(t_list **alst, char **str) -{ - t_list *start; - t_list **end; - t_token *token; - int tk; - char *new; - char *fit; - char *bq_start; - char *bq_end; - t_lexer lexer; - - tk = TK_BQUOTE; - if ((start = ft_lst_find(*alst, &tk, token_cmp_type))) - { - end = &start->next; - while (end && *end) - { - token = (*end)->content; - if (token->type == TK_BQUOTE) - break ; - end = &(*end)->next; - } - if (!*end) - return (-1); - bq_start = ((t_token*)start->content)->data; - bq_end = ((t_token*)(*end)->content)->data; - ft_lstdel(end, token_free); - fit = command_getoutput(ft_strbetween(bq_start + 1, bq_end)); - new = ft_strreplace(str, bq_start, bq_end, fit); - ft_strdel(str); - *str = new; - ft_lstdel(alst, token_free); - - lexer.pos = 0; - lexer.str = *str; - lexer.state = DEFAULT; - lexer_lex(alst, &lexer); - return (1); - } - return (0); -} - diff --git a/42sh/src/lexer/token_expand_var.c b/42sh/src/lexer/token_expand_var.c deleted file mode 100644 index 689dcb60..00000000 --- a/42sh/src/lexer/token_expand_var.c +++ /dev/null @@ -1,29 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* token_expand_var.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/10 14:57:53 by jhalford #+# #+# */ -/* Updated: 2017/02/07 13:16:04 by wescande ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "lexer.h" -/* -void token_expand_var(t_token *token) -{ - char *dollar; - char *val; - - dollar = ft_strchr(token->data, '$'); - if (!dollar[1]) - return ; - val = ft_getenv(data_singleton()->env, dollar + 1); - *dollar = 0; - if (val) - while (*val) - token_append(token, *val++, 1, 1); -} -*/ diff --git a/42sh/src/lexer/token_free.c b/42sh/src/lexer/token_free.c index a807db59..651b3611 100644 --- a/42sh/src/lexer/token_free.c +++ b/42sh/src/lexer/token_free.c @@ -18,11 +18,8 @@ void token_free(void *data, size_t size) (void)size; token = data; - if (!(token->type & TK_NON_FREEABLE)) - { - ft_strdel(&token->data); - ft_memdel((void **)&token->esc); - ft_memdel((void **)&token->esc2); - } + ft_strdel(&token->data); + ft_memdel((void **)&token->esc); + ft_memdel((void **)&token->esc2); free(token); } diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 3160048d..eeaf7f45 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -12,6 +12,35 @@ #include "minishell.h" +int non_interactive_shell(char *command) +{ + t_list *token; + t_lexer lexer; + t_btree *ast; + + lexer.pos = 0; + lexer.state = DEFAULT; + lexer.str = command; + lexer.stack = NULL; + token = NULL; + ast = NULL; + while (lexer.str[lexer.pos]) + { + if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH) + pop(&lexer.stack); + do { + lexer_lex(&token, &lexer); + } while (lexer.str[lexer.pos] == '\n'); + if (expand_bquotes(&token)) + return (1); + token_print(token); + if (ft_parse(&ast, &token)) + return (1); + if (ft_exec(&ast)) + return (1); + } + return (0); +} int interactive_shell() { t_list *token; @@ -34,6 +63,11 @@ int interactive_shell() DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state); token_print(token); } while (lexer.stack); + if (expand_bquotes(&token)) + return (1); + DG("check main 0"); + token_print(token); + DG("check main 1"); if (ft_parse(&ast, &token)) return (1); btree_print(STDBUG, ast, &ft_putast); @@ -55,5 +89,7 @@ int main(int ac, char **av) while (1) interactive_shell(); } + else + non_interactive_shell(shell_get_avdata()); return (0); } diff --git a/42sh/src/main/shell_exit.c b/42sh/src/main/shell_exit.c index 0983fa88..658ae832 100644 --- a/42sh/src/main/shell_exit.c +++ b/42sh/src/main/shell_exit.c @@ -16,6 +16,7 @@ void shell_exit(void) { DG("shell_exit()"); data_exit(); - job_kill_all(); + if (SH_HAS_JOBC(data_singleton()->opts)) + job_kill_all(); tcsetattr(STDIN, TCSANOW, &data_singleton()->jobc.shell_tmodes); } From 4840051dbd814b930c7abe2d20bd73f672ce159c Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Mon, 13 Feb 2017 17:46:56 +0100 Subject: [PATCH 09/10] backquote expansion checks for splitting --- 42sh/Makefile | 2 +- 42sh/src/glob/lib_perso/ft_memrealloc.c | 4 +-- 42sh/src/lexer/expand_bquotes.c | 38 +++++++++++++++---------- 42sh/src/lexer/lexer_bquote.c | 5 +++- 42sh/src/lexer/lexer_delim.c | 1 - 42sh/src/main/main.c | 2 +- 6 files changed, 31 insertions(+), 21 deletions(-) diff --git a/42sh/Makefile b/42sh/Makefile index 5fa85765..860d0f28 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -246,7 +246,7 @@ $(OBJ_DIR)%.o : $(SRC_DIR)%.c | $(OBJ_DIR) @$(eval COLOR=$(shell echo $$(($(PERCENT)%35+196)))) @$(eval TO_DO=$(shell echo $$((20-$(INDEX)*20/$(NB))))) @printf "\r\e[38;5;11m⌛ MAKE %10.10s : %2d%% \e[48;5;%dm%*s\e[0m%*s\e[48;5;255m \e[0m \e[38;5;11m %*s\e[0m\e[K" $(NAME) $(PERCENT) $(COLOR) $(DONE) "" $(TO_DO) "" $(DELTA) "$@" - @$(CC) $(FLAGS) -MMD -c $< -o $@\ + @$(CC) $(FLAGS) $(D_FLAGS) -MMD -c $< -o $@\ -I $(INC_DIR)\ -I $(LIBFT_INC) @$(eval INDEX=$(shell echo $$(($(INDEX)+1)))) diff --git a/42sh/src/glob/lib_perso/ft_memrealloc.c b/42sh/src/glob/lib_perso/ft_memrealloc.c index 4f3c6125..2ea59d78 100644 --- a/42sh/src/glob/lib_perso/ft_memrealloc.c +++ b/42sh/src/glob/lib_perso/ft_memrealloc.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_memrealloc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: wescande +#+ +:+ +#+ */ +/* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/05 13:44:36 by wescande #+# #+# */ -/* Updated: 2017/02/10 12:13:23 by gwojda ### ########.fr */ +/* Updated: 2017/02/09 17:01:01 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/expand_bquotes.c b/42sh/src/lexer/expand_bquotes.c index 9336761e..92d65856 100644 --- a/42sh/src/lexer/expand_bquotes.c +++ b/42sh/src/lexer/expand_bquotes.c @@ -19,13 +19,16 @@ int expand_bquotes(t_list **alst) t_list *cur_word; t_list *lst; t_token *token; - t_token token_buf; + t_token *token_buf; char *word; + char *ifs; char *output; + char *last_char; char *bq_start; char *bq_end; char *after_bq; char **str; + t_lexer lexer; t_flag tk; tk = TK_WORD; @@ -36,7 +39,6 @@ int expand_bquotes(t_list **alst) after_word = cur_word->next; token = cur_word->content; str = &token->data; - DG("found word=[%s]", *str); if (!(bq_start = ft_strchr(*str, '`'))) { cur_word = cur_word->next; @@ -49,31 +51,37 @@ int expand_bquotes(t_list **alst) } *bq_end = 0; after_bq = ft_strdup(bq_end + 1); - output = command_getoutput(bq_start + 1); - word = ft_strtok(output, " \n\t"); - DG("strtok=[%s]", word); - DG("first_tok was [%s]", *str); + word = command_getoutput(bq_start + 1); + output = word; + last_char = word + ft_strlen(word) - 1; + while (*last_char == '\n') + *last_char++ = 0; + ifs = ft_getenv(data_singleton()->env, "IFS"); + if (ifs) + word = ft_strtok(word, ifs); *bq_start = 0; ft_strappend(str, word); - DG("first_tok=[%s]", *str); - while ((word = ft_strtok(NULL, " \n\t"))) + while (ifs && (lexer.str = ft_strtok(NULL, ifs))) { - DG("strtok=[%s]", word); - token_buf.data = ft_strdup(word); - token_buf.type = TK_WORD; - new_word = ft_lstnew(&token_buf, sizeof(token_buf)); + lexer.pos = 0; + token_buf = token_init(); + token_buf->type = TK_WORD; + while (lexer.str[lexer.pos]) + { + token_append(token_buf, &lexer, 0, 0); + lexer.pos++; + } + new_word = ft_lstnew(token_buf, sizeof(*token_buf)); cur_word->next = new_word; new_word->next = after_word; cur_word = new_word; } - token = new_word->content; + token = cur_word->content; ft_strappend(&token->data, after_bq); ft_strdel(&after_bq); ft_strdel(&output); cur_word = after_word; } - token_print(*alst); - DG("check end"); return (0); } diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index 0f961942..e5e468dd 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -19,7 +19,10 @@ int lexer_bquote(t_list **alst, t_lexer *lexer) token = (*alst)->content; token->type = TK_WORD; - token_append(token, lexer, 0, 0); + if (lexer->state == DQUOTE_BQUOTE) + token_append(token, lexer, 1, 1); + else + token_append(token, lexer, 0, 0); if (lexer->str[lexer->pos] == '`') { lexer->pos++; diff --git a/42sh/src/lexer/lexer_delim.c b/42sh/src/lexer/lexer_delim.c index a30dd955..d4571deb 100644 --- a/42sh/src/lexer/lexer_delim.c +++ b/42sh/src/lexer/lexer_delim.c @@ -17,7 +17,6 @@ int lexer_delim(t_list **alst, t_lexer *lexer) t_token *token; token = (*alst)->content; - DG("DELIM"); while (ft_is_delim(lexer->str[lexer->pos])) lexer->pos++; lexer->state = DEFAULT; diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index eeaf7f45..7fa3ae46 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -67,9 +67,9 @@ int interactive_shell() return (1); DG("check main 0"); token_print(token); - DG("check main 1"); if (ft_parse(&ast, &token)) return (1); + DG("check main 1"); btree_print(STDBUG, ast, &ft_putast); if (ft_exec(&ast)) return (1); From be6be17f2a8979f4a2398145498dcb209fc79b9b Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Tue, 14 Feb 2017 00:42:22 +0100 Subject: [PATCH 10/10] bquotes expansion refactoring for future norm checks; still need to preventh field splitting for dquoted bquotes; also need to fuse bquote expansion into the globbing module --- 42sh/includes/lexer.h | 6 +- 42sh/libft | 2 +- 42sh/src/builtin/builtin_cd.c | 4 +- 42sh/src/lexer/expand_bquotes.c | 99 +++++++++++++++++--------------- 42sh/src/lexer/lexer_end.c | 7 ++- 42sh/src/lexer/token_append.c | 21 ++++++- 42sh/src/line-editing/readline.c | 11 ---- 42sh/src/main/main.c | 8 +-- 8 files changed, 86 insertions(+), 72 deletions(-) diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index 3e9f37fd..687203de 100644 --- a/42sh/includes/lexer.h +++ b/42sh/includes/lexer.h @@ -84,12 +84,16 @@ int ft_post_tokenize(t_list **alst, char **str); t_token *token_init(); int token_append(t_token *token, t_lexer *lexer, short int esc, short int esc2); +int token_append_char(t_token *token, char c, + short int esc, short int esc2); +int token_append_str(t_token *token, char *str, + short int esc, short int esc2); void token_free(void *data, size_t size); int token_cmp_type(t_token *token, t_type *ref); void token_print(t_list *lst); int reduce_parens(t_list **alst, char *str); -int expand_bquotes(t_list **alst); +int bquotes_expand(t_list **alst); char *command_getoutput(char *command); int ft_is_delim(char c); diff --git a/42sh/libft b/42sh/libft index d0ac53c6..ec8cf4e2 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit d0ac53c68648106b8bafcc5ee8334306f6b0bc7e +Subproject commit ec8cf4e252fe22cdc0925b9f71df2d2f5e8931f6 diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index b973bf53..adb0c8f4 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -13,10 +13,10 @@ #include "builtin.h" #define CDOPT_L (1 << 0) -#define CDOPT_P (1 << 2) +#define CDOPT_P (1 << 1) #define HAS_CDOPT_P(x) (x & CD_OPT_P) #define HAS_CDOPT_L(x) (x & CD_OPT_L) -#define CDERR_1 "cd: no such file or directory: %s\n" +#define CDERR_1 "{red}cd: no such file or directory: %s{eoc}\n" static char *builtin_cd_special(char *const av[], char *const env[]) { diff --git a/42sh/src/lexer/expand_bquotes.c b/42sh/src/lexer/expand_bquotes.c index 92d65856..e76391cf 100644 --- a/42sh/src/lexer/expand_bquotes.c +++ b/42sh/src/lexer/expand_bquotes.c @@ -12,75 +12,80 @@ #include "lexer.h" -int expand_bquotes(t_list **alst) +int bquotes_insert_words(t_list *cur_word, char *word, char *after_bq) { + char *ifs; t_list *new_word; t_list *after_word; - t_list *cur_word; - t_list *lst; t_token *token; - t_token *token_buf; - char *word; - char *ifs; + + after_word = cur_word->next; + ifs = ft_getenv(data_singleton()->env, "IFS"); + if (ifs) + word = ft_strtok(word, ifs); + token = cur_word->content; + token_append_str(token, word, 0, 0); + if (ifs) + while ((word = ft_strtok(NULL, ifs))) + { + token = token_init(); + token->type = TK_WORD; + token_append_str(token, word, 0, 0); + new_word = ft_lstnew(token, sizeof(*token)); + cur_word->next = new_word; + new_word->next = after_word; + cur_word = new_word; + } + token = cur_word->content; + ft_strappend(&token->data, after_bq); + return (0); +} + +int bquotes_substitute(t_list *cur_word, char *bq_start, char *bq_end) +{ char *output; char *last_char; + char *after_bq; + + *bq_start = 0; + *bq_end = 0; + output = command_getoutput(bq_start + 1); + after_bq = ft_strdup(bq_end + 1); + last_char = output + ft_strlen(output) - 1; + while (*last_char == '\n') + *last_char++ = 0; + bquotes_insert_words(cur_word, output, after_bq); + ft_strdel(&output); + ft_strdel(&after_bq); + return (0); +} + +int bquotes_expand(t_list **alst) +{ + t_list *cur_word; + t_list *lst; char *bq_start; char *bq_end; - char *after_bq; - char **str; - t_lexer lexer; t_flag tk; tk = TK_WORD; cur_word = *alst; - while (cur_word && (lst = ft_lst_find(cur_word, &tk, token_cmp_type))) + while ((lst = ft_lst_find(cur_word, &tk, token_cmp_type))) { cur_word = lst; - after_word = cur_word->next; - token = cur_word->content; - str = &token->data; - if (!(bq_start = ft_strchr(*str, '`'))) + if (!(bq_start = ft_strchr(((t_token*)cur_word->content)->data, '`'))) { cur_word = cur_word->next; - continue ; + return (0); } if (!(bq_end = ft_strchr(bq_start + 1, '`'))) { ft_dprintf(2, "{red}%s: parse error near '`'{eoc}\n", SHELL_NAME); return (-1); } - *bq_end = 0; - after_bq = ft_strdup(bq_end + 1); - word = command_getoutput(bq_start + 1); - output = word; - last_char = word + ft_strlen(word) - 1; - while (*last_char == '\n') - *last_char++ = 0; - ifs = ft_getenv(data_singleton()->env, "IFS"); - if (ifs) - word = ft_strtok(word, ifs); - *bq_start = 0; - ft_strappend(str, word); - while (ifs && (lexer.str = ft_strtok(NULL, ifs))) - { - lexer.pos = 0; - token_buf = token_init(); - token_buf->type = TK_WORD; - while (lexer.str[lexer.pos]) - { - token_append(token_buf, &lexer, 0, 0); - lexer.pos++; - } - new_word = ft_lstnew(token_buf, sizeof(*token_buf)); - cur_word->next = new_word; - new_word->next = after_word; - cur_word = new_word; - } - token = cur_word->content; - ft_strappend(&token->data, after_bq); - ft_strdel(&after_bq); - ft_strdel(&output); - cur_word = after_word; + if (bquotes_substitute(cur_word, bq_start, bq_end)) + return (-1); + cur_word = lst; } return (0); } diff --git a/42sh/src/lexer/lexer_end.c b/42sh/src/lexer/lexer_end.c index f635cb3d..f7650e81 100644 --- a/42sh/src/lexer/lexer_end.c +++ b/42sh/src/lexer/lexer_end.c @@ -4,11 +4,12 @@ int lexer_end(t_list **alst, t_lexer *lexer) { t_token *token; - token = (*alst)->content; - if (lexer->state == QUOTE + DG("check"); + if (*alst && (lexer->state == QUOTE || lexer->state == DQUOTE - || lexer->state == BQUOTE) + || lexer->state == BQUOTE)) { + token = (*alst)->content; ft_strappend(&lexer->str, (char[]){'\n', 0}); token_append(token, lexer, 1, 0); lexer->pos++; diff --git a/42sh/src/lexer/token_append.c b/42sh/src/lexer/token_append.c index 1b82a8d3..4917e23d 100644 --- a/42sh/src/lexer/token_append.c +++ b/42sh/src/lexer/token_append.c @@ -12,12 +12,12 @@ #include "lexer.h" -int token_append(t_token *token, t_lexer *lexer, short int esc, short int esc2) + +int token_append_char(t_token *token, char c, + short int esc, short int esc2) { int len; - char c; - c = lexer->str[lexer->pos]; len = ft_strlen(token->data); if (len >= token->size) { @@ -37,3 +37,18 @@ int token_append(t_token *token, t_lexer *lexer, short int esc, short int esc2) token->esc2[len >> 3] |= esc2 << (7 - len % 8); return (0); } + +int token_append_str(t_token *token, char *str, + short int esc, short int esc2) +{ + while (*str) + if (token_append_char(token, *str++, esc, esc2)) + return (1); + return (0); +} + +int token_append(t_token *token, t_lexer *lexer, + short int esc, short int esc2) +{ + return (token_append_char(token, lexer->str[lexer->pos], esc, esc2)); +} diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index ba2e6498..bce462e1 100644 --- a/42sh/src/line-editing/readline.c +++ b/42sh/src/line-editing/readline.c @@ -85,18 +85,7 @@ char *readline(char *prompt) readline_init(prompt); input = ft_read_stdin(); ft_putchar('\n'); - /* ft_check_line(); */ - /* ft_check_heredoc(&STR); */ if (tcsetattr(0, TCSANOW, ft_save_termios(0)) == -1) return (NULL); return (input); - - /* ft_history_parsing(); */ - /* if (STR && (!data_singleton()->line.list_beg || */ - /* ft_strcmp(data_singleton()->line.list_beg->prev->str, STR))) */ - /* { */ - /* ft_push_back_history(&data_singleton()->line.list_beg, */ - /* ft_create_history_list(STR)); */ - /* ft_add_in_history_file(STR); */ - /* } */ } diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 7fa3ae46..29497659 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -31,7 +31,7 @@ int non_interactive_shell(char *command) do { lexer_lex(&token, &lexer); } while (lexer.str[lexer.pos] == '\n'); - if (expand_bquotes(&token)) + if (bquotes_expand(&token)) return (1); token_print(token); if (ft_parse(&ast, &token)) @@ -63,13 +63,13 @@ int interactive_shell() DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state); token_print(token); } while (lexer.stack); - if (expand_bquotes(&token)) + if (!token) + return (0); + if (bquotes_expand(&token)) return (1); - DG("check main 0"); token_print(token); if (ft_parse(&ast, &token)) return (1); - DG("check main 1"); btree_print(STDBUG, ast, &ft_putast); if (ft_exec(&ast)) return (1);