diff --git a/42sh/.gitignore b/42sh/.gitignore index 1ecc9980..cfd0396b 100644 --- a/42sh/.gitignore +++ b/42sh/.gitignore @@ -6,3 +6,10 @@ STDBUG debug .42sh_history *.dSYM +.script.sh.swp +*.swp +*.swo +*.o +*.swn +STDBUG +STDEBUG diff --git a/42sh/Makefile b/42sh/Makefile index 73e636c3..f4e45468 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -6,7 +6,7 @@ # By: wescande +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2016/08/29 21:32:58 by wescande #+# #+# # -# Updated: 2017/03/04 17:27:41 by gwojda ### ########.fr # +#* Updated: 2017/03/05 15:36:45 by wescande ### ########.fr *# # # # **************************************************************************** # @@ -60,23 +60,42 @@ completion/c_terminal.c\ completion/completion.c\ exec/ast_free.c\ exec/bad_fd.c\ +exec/error_badidentifier.c\ exec/exec_ampersand.c\ exec/exec_and_if.c\ +exec/exec_case_branch.c\ exec/exec_command.c\ +exec/exec_elif.c\ +exec/exec_else.c\ +exec/exec_leaf.c\ +exec/exec_math.c\ exec/exec_or_if.c\ exec/exec_pipe.c\ -exec/exec_redir.c\ +exec/exec_reset.c\ exec/exec_semi.c\ +exec/exec_var.c\ exec/fd_is_valid.c\ exec/ft_exec.c\ exec/ft_findexec.c\ +exec/is_function.c\ +exec/launch_builtin.c\ +exec/launch_case.c\ +exec/launch_file.c\ +exec/launch_for.c\ +exec/launch_function.c\ +exec/launch_if.c\ exec/launch_process.c\ +exec/launch_subshell.c\ +exec/launch_until.c\ +exec/launch_while.c\ +exec/mark_process_status.c\ +exec/node_copy.c\ exec/process_redirect.c\ exec/process_reset.c\ -exec/process_resetfds.c\ -exec/process_setexec.c\ exec/process_setgroup.c\ exec/process_setsig.c\ +exec/redir_copy.c\ +exec/redir_free.c\ exec/redirect_dgreat.c\ exec/redirect_dless.c\ exec/redirect_great.c\ @@ -84,6 +103,16 @@ exec/redirect_greatand.c\ exec/redirect_less.c\ exec/redirect_lessand.c\ exec/set_exitstatus.c\ +exec/set_process.c\ +exec/set_process_case.c\ +exec/set_process_cmd.c\ +exec/set_process_for.c\ +exec/set_process_if.c\ +exec/set_process_map.c\ +exec/set_process_subshell.c\ +exec/set_process_until.c\ +exec/set_process_while.c\ +exec/token_to_argv.c\ glob/command_getoutput.c\ glob/dir_glob.c\ glob/esc_print.c\ @@ -94,10 +123,12 @@ glob/expand_home.c\ glob/expand_var.c\ glob/ft_strsplit_esc.c\ glob/ft_strsplit_spe.c\ +glob/gen_tab_esc.c\ glob/glob.c\ glob/is_char_esc.c\ glob/lib_perso/ft_ld_back.c\ glob/lib_perso/ft_ld_clear.c\ +glob/lib_perso/ft_ld_copy.c\ glob/lib_perso/ft_ld_del.c\ glob/lib_perso/ft_ld_front.c\ glob/lib_perso/ft_ld_new.c\ @@ -114,6 +145,8 @@ glob/lib_perso/ft_strsubf.c\ glob/lib_perso/ft_tabdel.c\ glob/lib_perso/ft_tablen.c\ glob/match_pattern.c\ +glob/tab_esc_copy.c\ +glob/word_is_assignment.c\ hash_table/ft_add_hash.c\ hash_table/hash.c\ hash_table/hash_free.c\ @@ -126,8 +159,6 @@ history/history_parsing_toolz.c\ history/history_parsing_toolz_2.c\ history/list_toolz.c\ history/surch_in_history.c\ -init_history.c\ -init_line.c\ job-control/builtin_bg.c\ job-control/builtin_fg.c\ job-control/builtin_jobs.c\ @@ -153,7 +184,19 @@ job-control/mark_job_as_running.c\ job-control/process_cmp_pid.c\ job-control/process_format.c\ job-control/process_free.c\ -job-control/process_mark_status.c\ +job-control/process_free_cmd.c\ +job-control/process_free_cond.c\ +job-control/process_free_list.c\ +job-control/process_free_subshell.c\ +job-control/process_print.c\ +job-control/process_print_case.c\ +job-control/process_print_cmd.c\ +job-control/process_print_for.c\ +job-control/process_print_function.c\ +job-control/process_print_if.c\ +job-control/process_print_subshell.c\ +job-control/process_print_until.c\ +job-control/process_print_while.c\ job-control/put_job_in_background.c\ job-control/put_job_in_foreground.c\ job-control/sigchld_handler.c\ @@ -162,18 +205,21 @@ job-control/sigtstp_handler.c\ job-control/sigttin_handler.c\ job-control/sigttou_handler.c\ lexer/get_lexer_stack.c\ +lexer/get_reserved_words.c\ lexer/get_state_global.c\ lexer/get_state_redir.c\ +lexer/insert_newline.c\ +lexer/lexer_assignement_word.c\ lexer/lexer_backslash.c\ lexer/lexer_bquote.c\ -lexer/lexer_comment.c\ +lexer/lexer_curly_braces.c\ lexer/lexer_default.c\ lexer/lexer_delim.c\ -lexer/lexer_dless.c\ lexer/lexer_dquote.c\ lexer/lexer_end.c\ lexer/lexer_great.c\ lexer/lexer_greatand.c\ +lexer/lexer_heredoc.c\ lexer/lexer_init.c\ lexer/lexer_less.c\ lexer/lexer_lessand.c\ @@ -184,8 +230,6 @@ lexer/lexer_paren.c\ lexer/lexer_quote.c\ lexer/lexer_sep.c\ lexer/lexer_word.c\ -lexer/reduce_parens.c\ -lexer/stack_to_prompt.c\ lexer/token_append.c\ lexer/token_cmp_type.c\ lexer/token_free.c\ @@ -197,6 +241,8 @@ line-editing/copy_cut_paste.c\ line-editing/ft_prompt.c\ line-editing/get_key.c\ line-editing/home_end.c\ +line-editing/init_history.c\ +line-editing/init_line.c\ line-editing/init_termcaps.c\ line-editing/lib_line_editing/tool_line.c\ line-editing/lib_line_editing/tool_line_2.c\ @@ -213,27 +259,35 @@ line-editing/readline.c\ main/data_exit.c\ main/data_init.c\ main/data_singleton.c\ -main/ft_cleanup.c\ main/ft_putast.c\ -main/ft_putast2.c\ -main/lib_expansion.c\ +main/instruction_free.c\ main/main.c\ -main/remove_trailing_esc_nl.c\ main/shell_get_avdata.c\ main/shell_get_opts.c\ main/shell_init.c\ -main/sig_handler.c\ +parser/add_case.c\ +parser/add_cmd.c\ +parser/add_condition.c\ +parser/add_func.c\ +parser/add_loop.c\ +parser/add_math.c\ +parser/add_number.c\ +parser/add_redir.c\ +parser/add_sep.c\ +parser/add_subshell.c\ +parser/add_var.c\ +parser/aggregate_sym.c\ +parser/build_tree.c\ +parser/error_syntax.c\ +parser/eval_sym.c\ parser/ft_parse.c\ -parser/parse_dgreat.c\ -parser/parse_dless.c\ -parser/parse_great.c\ -parser/parse_greatand.c\ -parser/parse_less.c\ -parser/parse_lessand.c\ -parser/parse_redir.c\ -parser/parse_separator.c\ -parser/parse_subshell.c\ -parser/parse_word.c +parser/heredoc_parser.c\ +parser/parser_init.c\ +parser/pop_stack.c\ +parser/produce_sym.c\ +parser/push_stack.c\ +parser/read_stack.c\ +parser/tree_wrapper.c SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) @@ -244,13 +298,13 @@ all : @make -j $(NAME) $(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) - @$(CC) $(FLAGS) $(D_FLAGS) \ + @$(CC) $(OBJS) -o $(NAME) \ -I $(INC_DIR) \ -I $(LIBFT_INC) \ $(LIBS) \ - $(LIBFT_LIB) $(OBJS) \ - -o $(NAME) - @printf "\r\e[48;5;15;38;5;25m✅ MAKE $(NAME)\e[0m\e[K\n" + $(LIBFT_LIB) \ + $(FLAGS) $(D_FLAGS) + @printf "\r\033[48;5;15;38;5;25m✅ MAKE $(NAME)\033[0m\033[K\n" $(LIBFT_LIB): @make -C $(LIBFT_DIR) @@ -264,7 +318,7 @@ $(OBJ_DIR)%.o : $(SRC_DIR)%.c | $(OBJ_DIR) @$(eval PERCENT=$(shell echo $$(($(INDEX)*100/$(NB))))) @$(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) "$@" + @printf "\r\033[38;5;11m⌛ MAKE %10.10s : %2d%% \033[48;5;%dm%*s\033[0m%*s\033[48;5;255m \033[0m \033[38;5;11m %*.*s\033[0m\033[K" $(NAME) $(PERCENT) $(COLOR) $(DONE) "" $(TO_DO) "" $(DELTA) $(DELTA) "$@" @$(CC) $(FLAGS) $(D_FLAGS) -MMD -c $< -o $@\ -I $(INC_DIR)\ -I $(LIBFT_INC) @@ -272,14 +326,14 @@ $(OBJ_DIR)%.o : $(SRC_DIR)%.c | $(OBJ_DIR) clean: cleanlib @rm -rf $(OBJ_DIR) - @printf "\r\e[38;5;202m✖ clean $(NAME).\e[0m\e[K\n" + @printf "\r\033[38;5;202m✖ clean $(NAME).\033[0m\033[K\n" cleanlib: @make -C $(LIBFT_DIR) clean fclean: clean fcleanlib @rm -f $(NAME) - @printf "\r\e[38;5;196m❌ fclean $(NAME).\e[0m\e[K\n" + @printf "\r\033[38;5;196m❌ fclean $(NAME).\033[0m\033[K\n" fcleanlib: cleanlib @make -C $(LIBFT_DIR) fclean diff --git a/42sh/TESTSHELL/simple_cmd/echo.test b/42sh/TESTSHELL/simple_cmd/echo.test new file mode 100644 index 00000000..3997594c --- /dev/null +++ b/42sh/TESTSHELL/simple_cmd/echo.test @@ -0,0 +1 @@ +echo 'je suis un test' diff --git a/42sh/TESTSHELL/simple_cmd/ls.test b/42sh/TESTSHELL/simple_cmd/ls.test new file mode 100644 index 00000000..9e2740c6 --- /dev/null +++ b/42sh/TESTSHELL/simple_cmd/ls.test @@ -0,0 +1 @@ +ls diff --git a/42sh/TESTSHELL/simple_cmd/pwd.test b/42sh/TESTSHELL/simple_cmd/pwd.test new file mode 100644 index 00000000..f748bdd0 --- /dev/null +++ b/42sh/TESTSHELL/simple_cmd/pwd.test @@ -0,0 +1 @@ +pwd diff --git a/42sh/TESTSHELL/stderr_ref b/42sh/TESTSHELL/stderr_ref new file mode 100644 index 00000000..e69de29b diff --git a/42sh/TESTSHELL/stderr_test b/42sh/TESTSHELL/stderr_test new file mode 100644 index 00000000..e69de29b diff --git a/42sh/TESTSHELL/stdin_ref b/42sh/TESTSHELL/stdin_ref new file mode 100644 index 00000000..b689ff6b --- /dev/null +++ b/42sh/TESTSHELL/stdin_ref @@ -0,0 +1,14 @@ +42sh +Makefile +TESTSHELL +donovan_segaults_06-02 +file1 +file2 +includes +libft +objs +pdf +sample +src +test_framework.sh +update_makefile.sh diff --git a/42sh/TESTSHELL/stdin_test b/42sh/TESTSHELL/stdin_test new file mode 100644 index 00000000..4b6a7bbd --- /dev/null +++ b/42sh/TESTSHELL/stdin_test @@ -0,0 +1,43 @@ + main.c 107start of shell JOBC is ON + token_print.c 21 token print + token_print.c 25 token : TK_WORD data [ls] + + insert_newline.c 19 insert newline + ft_parse.c 45  + + build_tree.c 83 func TK : 'TK_WORD' TK : 'TK_WORD' + add_cmd.c 55 add data + ft_parse.c 45  + + build_tree.c 83 func TK : 'TK_NEWLINE' TK : 'TK_NEWLINE' + add_sep.c 21 add sep + ft_parse.c 45  + + ft_parse.c 58 sucessful parsing + main.c 64 Before execution: + NEW + +----+ + CMD + ft_exec.c 39  + ft_exec.c 48 match : TK_NEWLINE and TK_NEWLINE + exec_semi.c 20  + exec_semi.c 22  + ft_exec.c 39  + ft_exec.c 48 match : NON-DEFINED and NON-DEFINED + exec_command.c 52 op=2118139328 +42sh +Makefile +TESTSHELL +donovan_segaults_06-02 +file1 +file2 +includes +libft +objs +pdf +sample +src +test_framework.sh +update_makefile.sh + exec_semi.c 24  + ft_exec.c 39  diff --git a/42sh/includes/builtin.h b/42sh/includes/builtin.h index dd7b03a8..5f27f108 100644 --- a/42sh/includes/builtin.h +++ b/42sh/includes/builtin.h @@ -6,7 +6,6 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:21:56 by jhalford #+# #+# */ -/* Updated: 2017/02/18 16:44:35 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 70a3de50..850f95d6 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -6,100 +6,139 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:49:55 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 19:15:13 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef EXEC_H # define EXEC_H +# include +# include "minishell.h" + # define PIPE_READ 0 # define PIPE_WRITE 1 -# define PROCESS_BUILTIN (1 << 0) -# define PROCESS_BINARY (1 << 1) -# define PROCESS_SCRIPT (1 << 2) -# define PROCESS_SUBSHELL (1 << 3) -# define PROCESS_UNKNOWN (1 << 4) -# define PROCESS_PIPESTART (1 << 5) -# define PROCESS_PIPEEND (1 << 6) -# define PROCESS_COMPLETED (1 << 7) -# define PROCESS_SUSPENDED (1 << 8) -# define PROCESS_RUNNING (1 << 9) -# define PROCESS_CONTINUED (1 << 10) +# define PROCESS_COMPLETED (1 << 0) +# define PROCESS_SUSPENDED (1 << 1) +# define PROCESS_RUNNING (1 << 2) +# define PROCESS_CONTINUED (1 << 3) -# define PROCESS_TYPE_MASK (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4) -# define PROCESS_STATE_MASK (1 << 7 | 1 << 8 | 1 << 9 | 1 << 10) +# define PROCESS_STATE_MASK ((1 << 4) - (1 << 0)) -# define IS_PIPESTART(a) (a & PROCESS_PIPESTART) -# define IS_PIPEEND(a) (a & PROCESS_PIPEEND) -# define IS_PIPESINGLE(a) ((a & PROCESS_PIPESTART) && (a & PROCESS_PIPEEND)) +# define IS_PIPESTART(p) ((p).fdin == STDIN) +# define IS_PIPEEND(p) ((p).fdout == STDOUT) +# define IS_PIPESINGLE(p) (IS_PIPESTART(p) && IS_PIPEEND(p)) -# include "libft.h" -# include "types.h" -# include "job_control.h" +/* # define EXEC_BG (1 << 1) */ +# define EXEC_AND_IF (1 << 2) +# define EXEC_OR_IF (1 << 3) +# define EXEC_IF_BRANCH (1 << 4) +# define EXEC_CASE_BRANCH (1 << 5) + +# define EXEC_AOL_MASK (EXEC_AND_IF | EXEC_OR_IF) + +# define EXEC_IS_BG(j) (j & EXEC_BG) +# define EXEC_IS_FG(j) (!EXEC_IS_BG(j)) +# define EXEC_IS_AND_IF(j) (j & EXEC_AND_IF) +# define EXEC_IS_OR_IF(j) (j & EXEC_OR_IF) +# define EXEC_IS_IF_BRANCH(j) (j & EXEC_IF_BRANCH) +# define EXEC_IS_CASE_BRANCH(j) (j & EXEC_CASE_BRANCH) + +struct s_data_cmd +{ + char **av; + char *path; + t_execf *execf; + struct stat *stat; +}; + +struct s_data_cond +{ + t_btree *condition; + t_btree *content; +}; + +struct s_data_list +{ + t_ld *list_word; + t_btree *content; +}; + +struct s_data_subshell +{ + t_btree *content; +}; + +union u_process_data +{ + struct s_data_cmd cmd; + struct s_data_subshell subshell; + struct s_data_subshell function; + struct s_data_cond d_while; + struct s_data_cond d_until; + struct s_data_cond d_if; + struct s_data_list d_for; + struct s_data_list d_case; +}; + +enum e_process_type +{ + PROCESS_FUNCTION, + PROCESS_BUILTIN, + PROCESS_FILE, + PROCESS_SUBSHELL, + PROCESS_WHILE, + PROCESS_UNTIL, + PROCESS_IF, + PROCESS_FOR, + PROCESS_CASE, + PROCESS_MAX +}; + +typedef enum e_process_type t_process_type; +typedef union u_process_data t_process_data; +typedef struct s_data_cond t_data_while; +typedef struct s_data_cond t_data_if; +typedef struct s_data_cond t_data_if; struct s_process { - char **av; - char *path; - t_execf *execf; - pid_t pid; - int fdin; - int fdout; - t_list *redirs; - int toclose; - int status; - t_flag attributes; + t_process_type type; + t_process_data data; + pid_t pid; + int fdin; + int fdout; + int to_close; + t_list *redirs; + int status; + t_flag attrs; }; struct s_exec { - char *aol_status; - int aol_search; t_job job; - t_process process; - int fd0save; - int fd1save; - int fd2save; + int fd_save[3]; + t_flag attrs; + int fdin; + t_list *op_stack; + char **case_pattern; + int control_count; }; -struct s_execmap -{ - t_type type; - int (*f)(t_btree **ast); -}; -struct s_redirmap -{ - t_flag type; - int (*f)(t_redir *redir); -}; +extern t_itof g_execmap[]; +extern t_itof g_redirmap[]; +extern t_itof g_launchmap[]; -#include "minishell.h" -extern t_execmap g_execmap[]; -extern t_redirmap g_redirmap[]; - -int ft_exec(t_btree **ast); - -int exec_semi(t_btree **ast); -int exec_ampersand(t_btree **ast); -int exec_or_if(t_btree **ast); -int exec_and_if(t_btree **ast); -int exec_pipe(t_btree **ast); -int exec_redir(t_btree **ast); -int exec_command(t_btree **ast); - -int launch_process(t_process *p); -int process_setexec(t_type type, t_process *p); +int exec_reset(void); int process_setgroup(t_process *p, pid_t pid); void process_setsig(void); -void process_free(void *content, size_t content_size); void process_reset(t_process *p); void process_resetfds(void); -int fd_is_valid(int fd); +int fd_is_valid(int fd, int flag); int bad_fd(int fd); int process_redirect(t_process *p); int redirect_great(t_redir *redir); @@ -114,5 +153,69 @@ char *ft_findexec(char *path, char *file); void set_exitstatus(int status, int override); void ast_free(void *data, size_t content_size); +void *node_copy(void *data); +void *redir_copy(void *data); + +void redir_free(void *data, size_t content_size); + +char **token_to_argv(t_ld *ld, int do_match); + +int add_new_job(t_job *job); + +int error_badidentifier(char *name); +t_btree *is_function(t_process *p); + +/* +** Mapping pour free les process +*/ +void process_free(void *content, size_t content_size); +int process_free_cmd(t_process *p); +int process_free_cond(t_process *p); +int process_free_list(t_process *p); +int process_free_subshell(t_process *p); + +/* +** Mapping pour launch les process +*/ +int launch_process(t_process *p); +int launch_if(t_process *p); +int launch_while(t_process *p); +int launch_until(t_process *p); +int launch_for(t_process *p); +int launch_case(t_process *p); +int launch_file(t_process *p); +int launch_builtin(t_process *p); +int launch_subshell(t_process *p); +int launch_function(t_process *p); + +/* +** Mapping pour set les process +*/ + +int set_process(t_process *p, t_btree *ast); +int set_process_map(t_process *p, t_btree *ast); +int set_process_cmd(t_process *p, t_btree *ast); +int set_process_while(t_process *p, t_btree *ast); +int set_process_until(t_process *p, t_btree *ast); +int set_process_if(t_process *p, t_btree *ast); +int set_process_for(t_process *p, t_btree *ast); +int set_process_case(t_process *p, t_btree *ast); +int set_process_subshell(t_process *p, t_btree *ast); + +/* +** Mapping pour exec les process +*/ +int ft_exec(t_btree **ast); +int exec_leaf(t_btree **ast); +int exec_semi(t_btree **ast); +int exec_ampersand(t_btree **ast); +int exec_or_if(t_btree **ast); +int exec_and_if(t_btree **ast); +int exec_pipe(t_btree **ast); +int exec_elif(t_btree **ast); +int exec_else(t_btree **ast); +int exec_var(t_btree **ast); +int exec_case_branch(t_btree **ast); +int exec_math(t_btree **ast); #endif diff --git a/42sh/includes/ft_curs.h b/42sh/includes/ft_curs.h new file mode 100644 index 00000000..1f17a2c7 --- /dev/null +++ b/42sh/includes/ft_curs.h @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_curs.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sbenning +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2016/12/08 16:34:51 by sbenning #+# #+# */ +/* Updated: 2017/01/19 21:53:40 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_CURS_H +# define FT_CURS_H + +# include "libft.h" + +# include +# include +# include +# include +# include + +typedef struct s_curs t_curs; + +/* + * Cursor data : cursor's coordonate and windows size +*/ + +struct s_curs +{ + int co; + int li; + int win_co; + int win_li; +}; + +/* + * Cursor reference singleton +*/ + +t_curs *curs_single(t_curs *curs, int set); + +/* + * Cursor setup +*/ + +int curs_li_ask(void); +int curs_co_ask(void); + +int curs_term_setup(void); +void curs_win_setup(t_curs *curs); +int curs_coo_setup(t_curs *curs); +int curs_setup(t_curs *curs); + +/* + * Cursor cleanup +*/ + +int curs_term_cleanup(void); +int curs_cleanup(t_curs *curs); + +/* + * Cursor's data reset +*/ + +void curs_reset(int sig); + +/* + * Cursor manipulation function +*/ + +void curs_clear(t_curs *curs); +void curs_clear_post(t_curs *curs); +void curs_goto(t_curs *curs, int li, int co); +void curs_forward(t_curs *curs, int offset); +void curs_backward(t_curs *curs, int offset); +void curs_write(t_curs *curs, char *str, size_t len); +void curs_write_static(t_curs *curs, char *str, size_t len); +void curs_video_write(t_curs *curs, char *str, size_t len); +void curs_video_write_static(t_curs *curs, char *str, size_t len); + +#endif diff --git a/42sh/includes/ft_input.h b/42sh/includes/ft_input.h index 5e8c59a3..a7e44e03 100644 --- a/42sh/includes/ft_input.h +++ b/42sh/includes/ft_input.h @@ -6,7 +6,7 @@ /* By: sbenning +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/09 02:05:22 by sbenning #+# #+# */ -/* Updated: 2017/01/10 11:45:38 by jhalford ### ########.fr */ +/* Updated: 2017/02/03 15:18:27 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index a81469fa..0c0b62cf 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/03/07 17:36:15 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 23:23:38 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,6 +30,8 @@ # include # include +# include "ft_input.h" + # define FLECHE_HAUT 4283163 # define FLECHE_BAS 4348699 # define FLECHE_GAUCHE 4479771 @@ -53,12 +55,12 @@ # define TOUCHE_F5 892427035 # define TOUCHE_F6 925981467 -# define IS_QUOTES (1 << 0) -# define IS_BQUOTES (1 << 1) -# define IS_DQUOTES (1 << 2) -# define IS_BSLASH (1 << 3) -# define IS_ACCOLADE (1 << 4) -# define IS_BRACKET (1 << 5) +/* # define IS_QUOTES (1 << 0) */ +/* # define IS_BQUOTES (1 << 1) */ +/* # define IS_DQUOTES (1 << 2) */ +/* # define IS_BSLASH (1 << 3) */ +/* # define IS_ACCOLADE (1 << 4) */ +/* # define IS_BRACKET (1 << 5) */ # define STR data_singleton()->line.input # define POS data_singleton()->line.pos @@ -150,7 +152,7 @@ void ft_c(void); void ft_x(void); void ft_v(void); void ft_read_it(int input, size_t *pos, char **str); -char *readline(char *); +int readline(int fd, int prompt, char **input); int ft_completion(int ret); struct termios *ft_save_termios(int save); diff --git a/42sh/includes/glob.h b/42sh/includes/glob.h index 008e9eb4..03d55ff0 100644 --- a/42sh/includes/glob.h +++ b/42sh/includes/glob.h @@ -6,15 +6,13 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:31:18 by wescande #+# #+# */ -/* Updated: 2017/03/03 16:15:47 by wescande ### ########.fr */ +/* Updated: 2017/03/08 23:24:38 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef GLOB_H # define GLOB_H -# include "minishell.h" - # define CH(x) ((char **)(x)->content) # define UCH(x) ((unsigned char **)(x)->content) # define SCH(x) ((char **)(x).content) @@ -64,6 +62,8 @@ typedef struct s_bquote char **glob(char *str, unsigned char *esc, unsigned char *dbl_esc, int do_match); void esc_print(char *str, unsigned char *esc); +int word_is_assignment(char **content); +void *tab_esc_copy(void *content); /* ** return TRUE if path file is a directory. @@ -97,6 +97,7 @@ void expand_brace(t_glob *tglob); void expand_bquote(t_glob *gl); void expand_home(t_glob *gl, char *str); void expand_var(t_glob *tglob); +void expand_home(t_glob *gl, char *str); int match_pattern(t_glob *tglob, char *str, char *full_word); int dir_research(t_glob *tglob, char *p, char *pat, int rec); char **gen_tab(const char *pat, const unsigned char *esc, @@ -105,31 +106,5 @@ char **ft_strsplit_spe(const char *str, const unsigned char *esc, char c); unsigned char **ft_strsplit_esc(const char *str, const unsigned char *esc, char c); -/* -** LIST D: -*/ -void ft_ld_new(t_ld **alst, void *content); -t_ld *ft_ld_front(t_ld *ld); -void ft_ld_pushfront(t_ld **alst, void *content); -void ft_ld_pushback(t_ld **alst, void *content); -size_t ft_ld_size(t_ld *ld); -void ft_ld_del(t_ld **ld, void (*del)()); -void ft_ld_clear(t_ld **ld, void (*del)()); -void ft_ld_reverse(t_ld **lst); -t_ld *ft_ld_back(t_ld *ld); -t_ld *ft_ld_swap(t_ld *l_cur); -char **ft_ld_to_tab(t_ld *ld); -t_ld *ft_ld_order(t_ld *ld, int (*f)(), void (*del)()); -/* -** str: -*/ - -char *ft_strjoinf(char *str, char *str2, int mode); -char *ft_strsubf(char *s, unsigned int start, - size_t len, short int mode); -void ft_tabdel(char ***mytab); -int ft_tablen(char **mytab); - -void *ft_memrealloc(void *ptr, size_t old_s, size_t new_s); #endif diff --git a/42sh/includes/job_control.h b/42sh/includes/job_control.h index 76a72498..0598611e 100644 --- a/42sh/includes/job_control.h +++ b/42sh/includes/job_control.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 16:55:09 by jhalford #+# #+# */ -/* Updated: 2017/01/31 14:40:08 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:06:47 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,15 +22,15 @@ # define JOB_NOTIFIED (1 << 0) # define JOB_BG (1 << 1) # define JOB_IS_BG(j) (j & JOB_BG) -# define JOB_IS_FG(j) !(j & JOB_BG) +# define JOB_IS_FG(j) (!JOB_IS_BG(j)) -#define JOBS_OPTS_L (1 << 0) +# define JOBS_OPTS_L (1 << 0) struct s_job { int id; pid_t pgid; - t_flag attributes; + t_flag attrs; t_list *first_process; struct termios tmodes; }; @@ -58,7 +58,7 @@ void job_format_head(t_job *j); void job_update_status(void); void mark_job_as_running (t_job *j); -int process_mark_status(pid_t pid, int status); +int mark_process_status(pid_t pid, int status); int job_is_stopped(int id); int job_is_completed(int id); @@ -84,5 +84,17 @@ void sigttou_handler(int signo); int process_cmp_pid(t_process *p, pid_t *pid); void process_format(t_list **p, int firstp, int opts); +/* +** Mapping pour afficher les process +*/ +void process_print(t_process *p); +int process_print_subshell(t_process *p); +int process_print_while(t_process *p); +int process_print_if(t_process *p); +int process_print_case(t_process *p); +int process_print_until(t_process *p); +int process_print_function(t_process *p); +int process_print_for(t_process *p); +int process_print_cmd(t_process *p); #endif diff --git a/42sh/includes/lexer.h b/42sh/includes/lexer.h index d89b0a54..7c5e0999 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/10 00:33:36 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:20:20 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,29 +17,15 @@ # include "libft.h" # include "types.h" -# define TK_LESS (1 << 0) -# define TK_GREAT (1 << 1) -# define TK_DLESS (1 << 2) -# define TK_DGREAT (1 << 3) -# define TK_LESSAND (1 << 4) -# define TK_GREATAND (1 << 5) -# define TK_SEMI (1 << 6) -# define TK_PIPE (1 << 7) -# define TK_AND_IF (1 << 8) -# define TK_OR_IF (1 << 9) -# define TK_AMP (1 << 10) -# define TK_PAREN_OPEN (1 << 11) -# define TK_PAREN_CLOSE (1 << 12) -# 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_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20) +# define TK_NON_FREEABLE (TK_PAREN_OPEN | TK_PAREN_CLOSE | TK_BQUOTE) +# define RW_SEP (TK_NEWLINE | TK_AMP | TK_SEMI | TK_WHILE | TK_DONE\ + | TK_DO | TK_IF | TK_FI | TK_THEN | TK_ELIF | TK_ELSE) enum e_lexstate { DEFAULT, + PAREN, + HEREDOC, NEWLINE, DELIM, SEP, @@ -49,14 +35,13 @@ enum e_lexstate GREAT, LESSAND, GREATAND, - DLESS, QUOTE, DQUOTE, BQUOTE, DQUOTE_BQUOTE, BACKSLASH, - PAREN, - COMMENT, + CURLY_BRACKETS, + ASSIGNEMENT_WORD, END, }; @@ -78,6 +63,13 @@ struct s_lexer t_list *heredoc_stack; }; +struct s_rvwords +{ + char *word; + int type; +}; + +extern t_rvwords g_rvwords[]; extern int (*g_lexer[])(t_list **alst, t_lexer *lexer); @@ -99,15 +91,21 @@ int bquotes_expand(t_list **alst); char *command_getoutput(char *command); int ft_is_delim(char c); -char *stack_to_prompt(t_list *stack); +int ft_is_delim_list(char c); +char *stack_to_prompt(t_list *stack); t_lexstate get_state_global(t_lexer *lexer); t_lexstate get_state_redir(t_lexer *lexer); int get_lexer_stack(t_lexer lexer); +int get_reserved_words(t_list **alst); +int insert_newline(t_list **alst); + void lexer_init(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_heredoc(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); @@ -116,12 +114,13 @@ int lexer_less(t_list **alst, t_lexer *lexer); int lexer_great(t_list **alst, t_lexer *lexer); int lexer_greatand(t_list **alst, t_lexer *lexer); int lexer_lessand(t_list **alst, t_lexer *lexer); -int lexer_dless(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_paren(t_list **alst, t_lexer *lexer); +int lexer_curly_braces(t_list **alst, t_lexer *lexer); +int lexer_assignement_word(t_list **alst, t_lexer *lexer); int lexer_comment(t_list **alst, t_lexer *lexer); int lexer_end(t_list **alst, t_lexer *lexer); diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index c034720b..6dcbefc4 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/18 11:10:50 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 20:53:04 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,36 +14,23 @@ # define MINISHELL_H # define SHELL_NAME "minishell" -# include "libft.h" -# include "types.h" -# include "lexer.h" -# include "parser.h" -# include "ft_readline.h" -# include "exec.h" -# include "builtin.h" -# include "job_control.h" -# include "glob.h" -# include "completion.h" -# include "hash.h" - # include # include -# include # include # include # include -# define SH_INTERACTIVE (1 << 0) -# define SH_OPTS_JOBC (1 << 1) -# define SH_OPTS_LC (1 << 2) -# define SH_MODE_INPUT (1 << 3) -# define SH_MODE_EXEC (1 << 4) - -# define SH_MODE_MASK (SH_MODE_INPUT | SH_MODE_EXEC) -# define SH_HAS_JOBC(b) (b & SH_OPTS_JOBC) -# define SH_IS_INTERACTIVE(b) (b & SH_INTERACTIVE) - -# define SH_MSG_NOJOBC "no job-control" +# include "../libft/includes/libft.h" +# include "types.h" +# include "lexer.h" +# include "parser.h" +# include "ft_readline.h" +# include "job_control.h" +# include "exec.h" +# include "builtin.h" +# include "glob.h" +# include "completion.h" +# include "hash.h" struct s_data { @@ -55,10 +42,11 @@ struct s_data t_comp *comp; t_exec exec; t_jobc jobc; + t_list *heredoc_queue; + char **local_var; + t_list *lst_func; }; -extern t_stof g_builtins[]; - void shell_get_opts(int ac, char **av); char *shell_get_avdata(); void shell_init(int ac, char **av); @@ -66,10 +54,8 @@ void shell_exit(void); int data_init(void); void data_exit(void); -void ft_expand_dollar(char **av, char **env); -char *ft_findexec(char *path, char *file); - -int remove_trailing_esc_nl(char *str); +int instruction_free(t_list **token, t_parser *parser, + t_btree **ast); char *ft_putast(void *node); void ft_putast2(void *node); diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index 47b850e1..6e8a06ff 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -1,66 +1,191 @@ /* ************************************************************************** */ /* */ -/* ::: :::::::: */ /* parser.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:54 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:09:20 by jhalford ### ########.fr */ +/* Updated: 2017/03/03 18:18:14 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef PARSER_H # define PARSER_H -# include "minishell.h" +/* +** Parse POSIX grammar +*/ + +enum e_parstate +{ + ERROR = 0, + UNDEFINED, + SUCCESS, +}; + +# define MATCH_STACK(x, y) (x == y || y == ALL) struct s_parser { - t_type type; - int (*f)(t_btree **ast, t_list **start, t_list **token); + t_parstate state; + t_list *stack; + t_sym *new_sym; + t_list *heredoc_queue; }; -union u_word +struct s_aggrematch { - char *word; - int fd; + t_sym top; + t_sym under; + t_sym new_sym; + int erase_sym; }; +struct s_prodmatch +{ + t_type token; + t_sym stack; + t_sym new_sym; +}; + +struct s_stackmatch +{ + t_sym top; + t_sym under; +}; + +struct s_errormatch +{ + t_type token; + char *error; +}; + +extern t_aggrematch g_aggrematch[]; +extern t_prodmatch g_prodmatch[]; +extern t_stackmatch g_stackmatch[]; +extern t_errormatch g_errormatch[]; + +void parser_init(t_parser *parser); +int ft_parse(t_btree **ast, t_list **token, t_parser *parser); + +int produce_sym(t_list **stack, t_sym *new_sym, t_list **lst); +int eval_sym(t_list **stack, t_sym new_sym); +int aggregate_sym(t_list **stack, t_sym *new_sym, t_parstate *state); + +int push_stack(t_list **stack, t_sym new_sym); +int pop_stack(t_list **stack, t_sym erase_sym); + +int pop_heredoc(t_list **heredoc_queue, t_list **lst); + +int error_syntax(t_list **token, t_parser *parser, t_btree **ast); +int error_EOF(t_list **token, t_parser *parser, t_btree **ast); + +int ft_read_stack(t_sym *stack); +char *read_state(t_sym current); + + +/* + * Build AST - rewriting + * +*/ + +struct s_treematch +{ + t_type type; + int (*add)(t_btree **ast, t_list **lst); +}; + +extern t_treematch g_treematch[]; + +int build_tree(t_btree **ast, t_list **lst); + +int add_sep(t_btree **ast, t_list **lst); +int add_cmd(t_btree **ast, t_list **lst); + +int add_file(t_btree **ast, t_list **lst); +int add_loop_cmd(t_btree **ast, t_list **lst); +int add_loop_sep(t_btree **ast, t_list **lst); +int add_loop_condition(t_btree **ast, t_list **lst); +int add_condition_cmd(t_btree **ast, t_list **lst); +int add_condition_sep(t_btree **ast, t_list **lst); +int add_branch(t_btree **ast, t_list **lst); +int add_redir_word(t_btree **ast, t_list **lst); +int add_redir_type(t_btree **ast, t_list **lst); +int add_case_cmd(t_btree **ast, t_list **lst); +int add_case_sep(t_btree **ast, t_list **lst); +int add_pattern(t_btree **ast, t_list **lst); +int add_subshell_cmd(t_btree **ast, t_list **lst); +int add_subshell_sep(t_btree **ast, t_list **lst); +int add_func_cmd(t_btree **ast, t_list **lst); +int add_func_sep(t_btree **ast, t_list **lst); +int add_one_func(t_btree **ast, t_list **lst); +int add_pipe(t_btree **ast, t_list **lst); +int add_var(t_btree **ast, t_list **lst); +int add_null(t_btree **ast, t_list **lst); +int add_ionumber(t_btree **ast, t_list **lst); + +int isloop(t_btree **ast, t_list **lst); +int isloop_condition(t_btree **ast, t_list **lst); +int iscase(t_btree **ast, t_list **lst); +int iscase_pattern(t_btree **ast, t_list **lst); +int iscase_branch(t_btree **ast, t_list **lst); +int iscondition(t_btree **ast, t_list **lst); +int iscondition_branch(t_btree **ast, t_list **lst); +int issubshell(t_btree **ast, t_list **lst); +int isfunc(t_btree **ast, t_list **lst); +int isfunc_name(t_btree **ast, t_list **lst); +int isdir(t_btree **ast); +int iscondition(t_btree **ast, t_list **list); +int isdir_sep(t_btree **ast, t_list **list); +int isdir_word(t_btree **ast, t_list **list); +int isvar(t_btree **ast, t_list **list); +int isnull(t_btree **ast, t_list **list); +int isionumber(t_btree **ast, t_list **lst); +int ismath(t_btree **ast, t_list **lst); +int ismath_expr(t_btree **ast, t_list **lst); + +int join_ast(t_btree **ast, t_btree **new_node); +int gen_node(t_btree **ast); +int superflous_token(t_btree **ast, t_list **list); + +struct s_distrostree +{ + int (*test)(t_btree **ast, t_list **lst); + int (*add)(t_btree **ast, t_list **lst); +}; + +extern t_distrostree g_distrostree[]; + struct s_redir { - t_flag type; + t_type type; int n; - t_word word; - int close; + char *word; + char *heredoc_data; + /* int close; */ +}; + +struct s_cmd +{ + t_list *redir; + t_ld *token; + t_ld *wordlist; }; union u_astdata { - t_redir redir; - t_ld *token; + t_cmd cmd; char **sstr; char *str; }; struct s_astnode { + int pattern; + int nest; + int full; t_type type; t_astdata data; }; -extern t_parser g_parser[]; - -int ft_parse(t_btree **ast, t_list **token); -int parse_separator(t_btree **ast, t_list **start, t_list **lst); -int parse_redir(t_btree **ast, t_list **start, t_list **lst); -int parse_less(t_btree **ast, t_list **start, t_list **lst); -int parse_great(t_btree **ast, t_list **start, t_list **lst); -int parse_dless(t_btree **ast, t_list **start, t_list **lst); -int parse_dgreat(t_btree **ast, t_list **start, t_list **lst); -int parse_lessand(t_btree **ast, t_list **start, t_list **lst); -int parse_greatand(t_btree **ast, t_list **start, t_list **lst); -int parse_word(t_btree **ast, t_list **start, t_list **lst); -int parse_subshell(t_btree **ast, t_list **start, t_list **lst); - #endif diff --git a/42sh/includes/types.h b/42sh/includes/types.h index d2d802aa..15b72159 100644 --- a/42sh/includes/types.h +++ b/42sh/includes/types.h @@ -6,40 +6,226 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:11:48 by jhalford #+# #+# */ -/* Updated: 2017/02/09 19:52:04 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 17:16:00 by ariard ### ########.fr */ +/* Updated: 2017/03/07 18:35:11 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef TYPES_H # define TYPES_H -typedef struct s_data t_data; +# include -typedef long long t_type; -typedef long long t_flag; -typedef struct s_line t_line; -typedef struct s_comp t_comp; -typedef struct s_exec t_exec; -typedef struct s_jobc t_jobc; -typedef enum e_mode t_mode; +# define SH_INTERACTIVE (1 << 0) +# define SH_OPTS_JOBC (1 << 1) +# define SH_OPTS_LC (1 << 2) +# define SH_MODE_INPUT (1 << 3) +# define SH_MODE_EXEC (1 << 4) -typedef struct s_lexer t_lexer; -typedef enum e_lexstate t_lexstate; -typedef struct s_token t_token; +# define SH_MODE_MASK (SH_MODE_INPUT | SH_MODE_EXEC) +# define SH_HAS_JOBC(b) (b & SH_OPTS_JOBC) +# define SH_IS_INTERACTIVE(b) (b & SH_INTERACTIVE) +# define SH_NO_INTERACTIVE(b) !(b & SH_INTERACTIVE) -typedef struct s_parser t_parser; -typedef struct s_ld t_ld; -typedef struct s_astnode t_astnode; -typedef struct s_redir t_redir; -typedef union u_astdata t_astdata; -typedef union u_word t_word; +# define SH_MSG_NOJOBC "no job-control" -typedef struct s_job t_job; -typedef struct s_execmap t_execmap; -typedef struct s_redirmap t_redirmap; -typedef struct s_process t_process; -typedef int (t_execf)(const char *path, char *const argv[], char *const envp[]); +typedef long long t_type; +typedef long long t_flag; + +typedef struct s_data t_data; +typedef struct s_line t_line; +typedef struct s_comp t_comp; +typedef struct s_exec t_exec; +typedef struct s_jobc t_jobc; +typedef enum e_mode t_mode; + +/* +** Execution types +*/ + +typedef struct s_lexer t_lexer; +typedef enum e_lexstate t_lexstate; +typedef struct s_token t_token; +typedef struct s_rvwords t_rvwords; + +typedef struct s_ld t_ld; + +/* +** Execution types +*/ + +typedef int t_condition; +typedef struct s_job t_job; +typedef struct s_process t_process; +typedef int (t_execf)(const char *path, + char *const argv[], + char *const envp[]); + +/* +** Parser types +*/ + +typedef struct s_astnode t_astnode; +typedef struct s_redir t_redir; +typedef struct s_cmd t_cmd; +typedef union u_astdata t_astdata; +typedef union u_word t_word; +typedef struct s_parser t_parser; +typedef int t_sym; +typedef enum e_parstate t_parstate; +typedef struct s_aggrematch t_aggrematch; +typedef struct s_prodmatch t_prodmatch; +typedef struct s_stackmatch t_stackmatch; +typedef struct s_errormatch t_errormatch; +typedef struct s_treematch t_treematch; +typedef struct s_distrostree t_distrostree; t_data *data_singleton(); +enum e_sym +{ + LINEBREAK = 1, + TK_COMMAND, + TK_LESS, + TK_GREAT, + TK_DLESS, + TK_DGREAT, + TK_LESSAND, + TK_GREATAND, + TK_SEMI, + TK_PIPE, + TK_AND_IF, + TK_OR_IF, + TK_AMP, + TK_PAREN_OPEN, + TK_PAREN_CLOSE, + TK_BQUOTE, + TK_NEWLINE, + TK_WHILE, + TK_DO, + TK_DONE, + TK_IF, + TK_THEN, + TK_FI, + TK_ELIF, + TK_ELSE, + TK_UNTIL, + TK_WORD, + TK_ASSIGNEMENT_WORD = 50, + TK_BANG, + TK_NAME, + TK_FOR, + TK_IO_NUMBER, + TK_DLESSDASH, + TK_LESSGREAT, + TK_CASE, + TK_IN, + TK_ESAC, + TK_CLOBBER, + TK_LBRACE, + TK_RBRACE, + TK_DSEMI, + PROGRAM = 100, + COMPLETE_COMMAND, + COMPLETE_COMMANDS, + LIST, + AND_OR, + PIPELINE, + PIPE_SEQUENCE, + COMMAND, + COMPOUND_COMMAND, + SUBSHELL, + COMPOUND_LIST, + TERM, + FOR_CLAUSE, + NAME, + IN, + WORDLIST, + CASE_CLAUSE, + CASE_LIST, + CASE_LIST_NS, + CASE_ITEM, + CASE_ITEM_NS, + PATTERN, + IF_CLAUSE, + BRACE_CLAUSE, + ELSE_PART, + WHILE_CLAUSE, + UNTIL_CLAUSE, + FUNCTION_DEFINITION, + FUNCTION_BODY, + FNAME, + BRACE_GROUP, + DO_GROUP, + SIMPLE_COMMAND, + CMD_NAME, + CMD_WORD, + CMD_PREFIX, + CMD_SUFFIX, + REDIRECT_LIST, + IO_REDIRECT, + IO_FILE, + FILENAME, + IO_HERE, + HERE_END, + NEWLINE_LIST, + SEPARATOR_OP, + SEPARATOR, + SEQUENTIAL_SEP, + BRACE, + LOOP, + FUNC, + PIPE_SEMI_SEQUENCE, + CMD_SUPERIOR, + SEQUENCE, + AND_OR_MAJOR, + AND_OR_MINOR, + END_COMMAND, + CONDITION, + COMPLETE_CONDITION, + FOR_WORDLIST, + PATTERN_CASE, + FUNC_NAME, + CLOSE_LIST, + MATH, + MATH_PLUS, + MATH_SUP, + REDIR, + CMD, + HEREDOCDATA, + HEREDOC_DELIM, + ALL = 200, + TERMINUS = 300, +}; + +/* +** LIST D: +*/ + +void ft_ld_new(t_ld **alst, void *content); +t_ld *ft_ld_front(t_ld *ld); +void ft_ld_pushfront(t_ld **alst, void *content); +void ft_ld_pushback(t_ld **alst, void *content); +size_t ft_ld_size(t_ld *ld); +void ft_ld_del(t_ld **ld, void (*del)()); +void ft_ld_clear(t_ld **ld, void (*del)()); +void ft_ld_reverse(t_ld **lst); +t_ld *ft_ld_back(t_ld *ld); +t_ld *ft_ld_swap(t_ld *l_cur); +char **ft_ld_to_tab(t_ld *ld); +t_ld *ft_ld_order(t_ld *ld, int (*f)(), void (*del)()); +t_ld *ft_ld_copy(t_ld *src, void *(*f)(void *elem)); + +/* +** str: +*/ + +char *ft_strjoinf(char *str, char *str2, int mode); +char *ft_strsubf(char *s, unsigned int start, + size_t len, short int mode); +void ft_tabdel(char ***mytab); +int ft_tablen(char **mytab); + +void *ft_memrealloc(void *ptr, size_t old_s, size_t new_s); + #endif diff --git a/42sh/libft b/42sh/libft index bc489f86..b209bb1f 160000 --- a/42sh/libft +++ b/42sh/libft @@ -1 +1 @@ -Subproject commit bc489f8664fdc24317c31b3069811f54b1178643 +Subproject commit b209bb1fb718a68256253d5ab5ff69a46a90d5d6 diff --git a/42sh/sample/assignement/var_01.sh b/42sh/sample/assignement/var_01.sh new file mode 100644 index 00000000..d77e8f12 --- /dev/null +++ b/42sh/sample/assignement/var_01.sh @@ -0,0 +1 @@ +HELLO=WORLD diff --git a/42sh/sample/brace/brace_01.sh b/42sh/sample/brace/brace_01.sh new file mode 100644 index 00000000..54b84d56 --- /dev/null +++ b/42sh/sample/brace/brace_01.sh @@ -0,0 +1 @@ +{ ls | cat } diff --git a/42sh/sample/case/case.sh b/42sh/sample/case/case.sh new file mode 100644 index 00000000..f41470f9 --- /dev/null +++ b/42sh/sample/case/case.sh @@ -0,0 +1,5 @@ +case van in + ( "bus" ) echo Hello world ;; + ( "velo" ) echo Comment va ;; + ( "van" ) ls ;; +esac diff --git a/42sh/sample/comment.sh b/42sh/sample/comment.sh new file mode 100644 index 00000000..9d021c74 --- /dev/null +++ b/42sh/sample/comment.sh @@ -0,0 +1,2 @@ +ls | cat +pwd ; cd diff --git a/42sh/sample/dir.sh b/42sh/sample/dir.sh new file mode 100644 index 00000000..f413e465 --- /dev/null +++ b/42sh/sample/dir.sh @@ -0,0 +1 @@ +file1 > sample/infinite.sh diff --git a/42sh/sample/laurier.sh b/42sh/sample/laurier.sh new file mode 100644 index 00000000..9e88cdd1 --- /dev/null +++ b/42sh/sample/laurier.sh @@ -0,0 +1,6 @@ +read -p "Quel est ton login ?" login +while [ 1 ] +do + echo "Tu es le meilleur codeur de l'ecole $login" + sleep 1 +done diff --git a/42sh/sample/ls b/42sh/sample/ls new file mode 100644 index 00000000..9e2740c6 --- /dev/null +++ b/42sh/sample/ls @@ -0,0 +1 @@ +ls diff --git a/42sh/sample/mix/mix.sh b/42sh/sample/mix/mix.sh new file mode 100644 index 00000000..795c1e37 --- /dev/null +++ b/42sh/sample/mix/mix.sh @@ -0,0 +1,21 @@ +if ls +then + pwd ; echo "Salut" + while ls + do + until pwd + do + echo KO SI JE M AFFICHE + done + if cat faux + then + echo BONJOUR MAKEFILE + elif [ -f Makefile ] + then + echo BONJOUR MAKEFILE + else + echo KO SI JE M M AFFICHE + fi + echo "Encore une" + done +fi diff --git a/42sh/sample/multiredir b/42sh/sample/multiredir new file mode 100644 index 00000000..0350bb6f --- /dev/null +++ b/42sh/sample/multiredir @@ -0,0 +1,3 @@ +cat < file1 < file2 > file3 > file4 + + diff --git a/42sh/sample/redir/redir.sh b/42sh/sample/redir/redir.sh new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/42sh/sample/redir/redir.sh @@ -0,0 +1 @@ + diff --git a/42sh/sample/stack.sh b/42sh/sample/stack.sh new file mode 100644 index 00000000..5b2b1f27 --- /dev/null +++ b/42sh/sample/stack.sh @@ -0,0 +1,3 @@ +cat && ls || ls | cat && ls | cat || ls + + diff --git a/42sh/sample/subshell/subshell01.sh b/42sh/sample/subshell/subshell01.sh new file mode 100644 index 00000000..f1f04671 --- /dev/null +++ b/42sh/sample/subshell/subshell01.sh @@ -0,0 +1,2 @@ +(ls | cat +pwd ; ls) diff --git a/42sh/sample/until.sh b/42sh/sample/until.sh new file mode 100644 index 00000000..c9394c45 --- /dev/null +++ b/42sh/sample/until.sh @@ -0,0 +1,8 @@ +until [ 1 ] +do + echo LOOP1 + until [ 1 ] + do + echo hello + done +done > file1 diff --git a/42sh/sample/until/01_until.sh b/42sh/sample/until/01_until.sh new file mode 100644 index 00000000..2a531998 --- /dev/null +++ b/42sh/sample/until/01_until.sh @@ -0,0 +1,11 @@ +until cat wefwef +do + until ls + do + pwd ; ls + done + until cat eqwfewf + do + ls | cat + done +done diff --git a/42sh/sample/until2.sh b/42sh/sample/until2.sh new file mode 100644 index 00000000..28aeabc8 --- /dev/null +++ b/42sh/sample/until2.sh @@ -0,0 +1,16 @@ +ONE=0 +while [ $ONE -le 10 ] +do + TWO=0 + while [ $TWO -le 10 ] + do + THREE=0 + while [ $THREE -le 10 ] + do + echo world + ((THREE++)) + done + ((TWO++)) + done + ((ONE++)) +done > file1 diff --git a/42sh/sample/while.sh b/42sh/sample/while.sh new file mode 100644 index 00000000..d0fd226b --- /dev/null +++ b/42sh/sample/while.sh @@ -0,0 +1,12 @@ +while + while + while ls | cat + do + ls + done + do + ls | cat + done +do + pwd +done diff --git a/42sh/sample/while/while01.sh b/42sh/sample/while/while01.sh new file mode 100644 index 00000000..403f8702 --- /dev/null +++ b/42sh/sample/while/while01.sh @@ -0,0 +1,11 @@ +while ls +do + while cat rwgwghe + do + echo Hello World + done + while pwd + do + echo Bonjour ca va + done +done diff --git a/42sh/sample/while2.sh b/42sh/sample/while2.sh new file mode 100644 index 00000000..6549f933 --- /dev/null +++ b/42sh/sample/while2.sh @@ -0,0 +1,16 @@ +ONE=11 +while [ $ONE -gt 1 ] +do + TWO=11 + while [ $TWO -gt 1 ] + do + THREE=11 + while [ $THREE -gt 1 ] + do + echo hello + ((THREE--)) + done + ((TWO--)) + done + ((ONE--)) +done > file1 diff --git a/42sh/sample/while_error.sh b/42sh/sample/while_error.sh new file mode 100644 index 00000000..c8102bb8 --- /dev/null +++ b/42sh/sample/while_error.sh @@ -0,0 +1,6 @@ +echo hello +while || +do + pwd ; +done +ls | cat diff --git a/42sh/sample/yale/yale0.ex b/42sh/sample/yale/yale0.ex new file mode 100644 index 00000000..8d12c570 --- /dev/null +++ b/42sh/sample/yale/yale0.ex @@ -0,0 +1 @@ +< A B | ( C 2> D & E < F ) > G ; H=I J K diff --git a/42sh/sample/yale/yale1.ex b/42sh/sample/yale/yale1.ex new file mode 100644 index 00000000..372d7e63 --- /dev/null +++ b/42sh/sample/yale/yale1.ex @@ -0,0 +1 @@ +< A B | C | D | E > F diff --git a/42sh/sample/yale/yale2.ex b/42sh/sample/yale/yale2.ex new file mode 100644 index 00000000..71e5a6d8 --- /dev/null +++ b/42sh/sample/yale/yale2.ex @@ -0,0 +1 @@ + A && B || C && D diff --git a/42sh/sample/yale/yale3.ex b/42sh/sample/yale/yale3.ex new file mode 100644 index 00000000..260a8b62 --- /dev/null +++ b/42sh/sample/yale/yale3.ex @@ -0,0 +1 @@ +A ; B & C ; D || E diff --git a/42sh/sample/yale/yale5.ex b/42sh/sample/yale/yale5.ex new file mode 100644 index 00000000..4cd3a71e --- /dev/null +++ b/42sh/sample/yale/yale5.ex @@ -0,0 +1 @@ +(A ; B &) | (C || D) && E diff --git a/42sh/sample/yale1.sh b/42sh/sample/yale1.sh new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/42sh/sample/yale1.sh @@ -0,0 +1 @@ + diff --git a/42sh/script.sh b/42sh/script.sh deleted file mode 100755 index 8fb9fff0..00000000 --- a/42sh/script.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -while [ 1 ]; do - sleep 1 - echo "a" -done diff --git a/42sh/src/builtin/bt_read_get.c b/42sh/src/builtin/bt_read_get.c index 62700b5a..575d694e 100644 --- a/42sh/src/builtin/bt_read_get.c +++ b/42sh/src/builtin/bt_read_get.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/21 18:00:03 by jhalford #+# #+# */ -/* Updated: 2017/02/03 15:58:41 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 11:27:49 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "builtin_read.h" +#include "minishell.h" int bt_read_getdelim(t_read *data, char *arg) { diff --git a/42sh/src/builtin/bt_read_parse.c b/42sh/src/builtin/bt_read_parse.c index b23672f1..d79c754c 100644 --- a/42sh/src/builtin/bt_read_parse.c +++ b/42sh/src/builtin/bt_read_parse.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/27 18:25:22 by jhalford #+# #+# */ -/* Updated: 2017/01/27 19:40:14 by jhalford ### ########.fr */ +/* Updated: 2017/03/05 15:28:10 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "builtin_read.h" +#include "minishell.h" static t_readopt *bt_read_getopt(char letter) { @@ -30,11 +30,9 @@ int bt_read_parse(t_read *data, char **av) { int i; int j; - int k; t_readopt *opt; i = 1; - k = 0; while (av[i]) { j = 0; diff --git a/42sh/src/builtin/bt_read_term.c b/42sh/src/builtin/bt_read_term.c index 131eaaf7..b0a7477b 100644 --- a/42sh/src/builtin/bt_read_term.c +++ b/42sh/src/builtin/bt_read_term.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "builtin.h" +#include "minishell.h" struct termios bt_read_term(int init) { diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index c2323c21..e3ace609 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -6,17 +6,19 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:57:53 by jhalford #+# #+# */ -/* Updated: 2017/02/17 13:51:18 by gwojda ### ########.fr */ +/* Updated: 2017/03/03 20:12:45 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "builtin.h" +#include "minishell.h" #define CDOPT_L (1 << 0) #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 "{red}cd: no such file or directory: %s{eoc}\n" +#define CDERR_2 "{red}cd: HOME not set{eoc}\n" +#define CDERR_3 "{red}cd: too many arguments{eoc}\n" static char *builtin_cd_special(char *const av[], char *const env[]) { @@ -25,7 +27,15 @@ static char *builtin_cd_special(char *const av[], char *const env[]) if (!*av) { if (!(target = ft_getenv((char**)env, "HOME"))) + { + ft_dprintf(2, CDERR_2); return (NULL); + } + } + else if (*av && *(av + 1)) + { + ft_dprintf(2, CDERR_3); + return (NULL); } else if (ft_strcmp(*av, "-") == 0) target = ft_strdup(ft_getenv((char**)env, "OLDPWD")); @@ -38,10 +48,8 @@ static int builtin_cd_opts(char *const av[], int *opts) { int i; int j; - int tmp_opts; i = 1; - tmp_opts = 0; if (av) while (av[i] && av[i][0] == '-' && av[i][1]) { @@ -49,35 +57,37 @@ static int builtin_cd_opts(char *const av[], int *opts) while (av[i][++j]) { if (av[i][j] == 'P') - tmp_opts |= CDOPT_P; + *opts = CDOPT_P; else if (av[i][j] == 'L') - tmp_opts |= CDOPT_L; + *opts = CDOPT_L; + else if (av[i][j] == '-') + return (i + 1); else return (i); } - *opts |= tmp_opts; - i++; + ++i; } return (i); } -int builtin_cd(const char *path, char *const av[], char *const envp[]) +int builtin_cd(const char *path, + char *const av[], char *const envp[]) { int i; int opts; char *target; char *cwd; - opts = 0; + opts = CDOPT_L; i = builtin_cd_opts(av, &opts); if (!(target = builtin_cd_special(av + i, envp))) - return (0); + return (1); cwd = getcwd(NULL, 0); builtin_setenv(path, (char*[3]){"OLDPWD", cwd, NULL}, envp); free(cwd); if (chdir(target)) { - ft_printf(CDERR_1, target); + ft_dprintf(2, CDERR_1, target); return (1); } else if (target != av[i]) diff --git a/42sh/src/builtin/builtin_echo.c b/42sh/src/builtin/builtin_echo.c index d044d7cf..2fd4f3de 100644 --- a/42sh/src/builtin/builtin_echo.c +++ b/42sh/src/builtin/builtin_echo.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:21:41 by jhalford #+# #+# */ -/* Updated: 2016/12/13 17:58:14 by jhalford ### ########.fr */ +/* Updated: 2017/01/20 00:10:31 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "builtin.h" +#include "minishell.h" int builtin_echo(const char *path, char *const av[], char *const envp[]) { diff --git a/42sh/src/builtin/builtin_env.c b/42sh/src/builtin/builtin_env.c index 64b2f931..9458300d 100644 --- a/42sh/src/builtin/builtin_env.c +++ b/42sh/src/builtin/builtin_env.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:14:20 by jhalford #+# #+# */ -/* Updated: 2017/02/17 15:56:55 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 11:29:18 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/builtin/builtin_exit.c b/42sh/src/builtin/builtin_exit.c index c7e8aff1..dbb33130 100644 --- a/42sh/src/builtin/builtin_exit.c +++ b/42sh/src/builtin/builtin_exit.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:28:41 by jhalford #+# #+# */ -/* Updated: 2017/03/07 15:24:39 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:25:01 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,10 +32,7 @@ int builtin_exit(const char *path, char *const av[], char *const envp[]) if (av && av[1]) status = ft_atoi(av[1]); else - { - /* status = ft_atoi(ft_getenv(data_singleton()->env, "?")); */ - status = 0; - } + status = ft_atoi(ft_getenv(data_singleton()->env, "?")); ft_save_termios(-1); ft_free_hash_table(); data_exit(); diff --git a/42sh/src/builtin/builtin_history.c b/42sh/src/builtin/builtin_history.c index 019af98e..0c653fbd 100644 --- a/42sh/src/builtin/builtin_history.c +++ b/42sh/src/builtin/builtin_history.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/24 14:54:53 by gwojda #+# #+# */ -/* Updated: 2017/01/26 14:58:41 by gwojda ### ########.fr */ +/* Updated: 2017/02/20 20:30:18 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/builtin/builtin_read.c b/42sh/src/builtin/builtin_read.c index cba5e4e6..264f2b3b 100644 --- a/42sh/src/builtin/builtin_read.c +++ b/42sh/src/builtin/builtin_read.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "builtin_read.h" +#include "minishell.h" t_readopt g_readtab[] = { diff --git a/42sh/src/builtin/builtin_setenv.c b/42sh/src/builtin/builtin_setenv.c index 3c803bd5..d5d5f99f 100644 --- a/42sh/src/builtin/builtin_setenv.c +++ b/42sh/src/builtin/builtin_setenv.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:25:17 by jhalford #+# #+# */ -/* Updated: 2017/02/17 13:18:25 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 11:28:05 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/builtin/is_builtin.c b/42sh/src/builtin/is_builtin.c index d9ba30bc..c48252ed 100644 --- a/42sh/src/builtin/is_builtin.c +++ b/42sh/src/builtin/is_builtin.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:09:57 by jhalford #+# #+# */ -/* Updated: 2017/02/18 16:44:56 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 19:42:54 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,9 +25,9 @@ t_stof g_builtin[] = {"jobs", &builtin_jobs}, {"fg", &builtin_fg}, {"bg", &builtin_bg}, - {"history", &builtin_history}, {"read", &builtin_read}, {"hash", &builtin_hash}, + {"history", &builtin_history}, {NULL, NULL}, }; @@ -37,7 +37,9 @@ t_execf *is_builtin(t_process *p) i = -1; while (g_builtin[++i].name) - if (ft_strcmp(g_builtin[i].name, p->av[0]) == 0) + { + if (ft_strcmp(g_builtin[i].name, p->data.cmd.av[0]) == 0) return (g_builtin[i].f); + } return (NULL); } diff --git a/42sh/src/completion/c_binary.c b/42sh/src/completion/c_binary.c index bccc73d8..bf359ca4 100644 --- a/42sh/src/completion/c_binary.c +++ b/42sh/src/completion/c_binary.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Retrieve the path from the env and create a char ** from the PATH pattern. diff --git a/42sh/src/completion/c_clear.c b/42sh/src/completion/c_clear.c index 815d12b5..80f6f3fb 100644 --- a/42sh/src/completion/c_clear.c +++ b/42sh/src/completion/c_clear.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Clear the list from the memory diff --git a/42sh/src/completion/c_files.c b/42sh/src/completion/c_files.c index dba7bc4f..5931ca22 100644 --- a/42sh/src/completion/c_files.c +++ b/42sh/src/completion/c_files.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** If the parsing for local file fail. The function is called to check if the diff --git a/42sh/src/completion/c_init.c b/42sh/src/completion/c_init.c index d9701694..5b5c6934 100644 --- a/42sh/src/completion/c_init.c +++ b/42sh/src/completion/c_init.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Trim if there's many commands in a raw separed with a semi colon. diff --git a/42sh/src/completion/c_matching.c b/42sh/src/completion/c_matching.c index 761f6ef3..25936087 100644 --- a/42sh/src/completion/c_matching.c +++ b/42sh/src/completion/c_matching.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Start the parsing for the autocompletion. diff --git a/42sh/src/completion/c_misc.c b/42sh/src/completion/c_misc.c index fbdd425a..eb740791 100644 --- a/42sh/src/completion/c_misc.c +++ b/42sh/src/completion/c_misc.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Support: Return the size of a char**. diff --git a/42sh/src/completion/c_output.c b/42sh/src/completion/c_output.c index 6b9f280d..6704ad3a 100644 --- a/42sh/src/completion/c_output.c +++ b/42sh/src/completion/c_output.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Update of the struct data. diff --git a/42sh/src/completion/c_parser.c b/42sh/src/completion/c_parser.c index f611f4df..3788ff73 100644 --- a/42sh/src/completion/c_parser.c +++ b/42sh/src/completion/c_parser.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Add the matching element to the list diff --git a/42sh/src/completion/c_pathsolver.c b/42sh/src/completion/c_pathsolver.c index 752d874d..6ab88f40 100644 --- a/42sh/src/completion/c_pathsolver.c +++ b/42sh/src/completion/c_pathsolver.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Solve the tilde pattern in the path diff --git a/42sh/src/completion/c_printer.c b/42sh/src/completion/c_printer.c index f43163de..c46fd10d 100644 --- a/42sh/src/completion/c_printer.c +++ b/42sh/src/completion/c_printer.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Print the name with or without an underline and colored upon file type diff --git a/42sh/src/completion/c_rematch.c b/42sh/src/completion/c_rematch.c index 13421f70..6771e656 100644 --- a/42sh/src/completion/c_rematch.c +++ b/42sh/src/completion/c_rematch.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Recreate a c->match value by adding the new key pressed to it. diff --git a/42sh/src/completion/c_sizing.c b/42sh/src/completion/c_sizing.c index 2d7adda9..559b3329 100644 --- a/42sh/src/completion/c_sizing.c +++ b/42sh/src/completion/c_sizing.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Get the max length from the list diff --git a/42sh/src/completion/c_terminal.c b/42sh/src/completion/c_terminal.c index 1b5d28a2..58d01bd7 100644 --- a/42sh/src/completion/c_terminal.c +++ b/42sh/src/completion/c_terminal.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Clear the previous list from the screen and restore the same position. diff --git a/42sh/src/completion/completion.c b/42sh/src/completion/completion.c index 42705b56..ba4717c7 100644 --- a/42sh/src/completion/completion.c +++ b/42sh/src/completion/completion.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "completion.h" +#include "minishell.h" /* ** Function to select the next item in the list if it has already been created diff --git a/42sh/src/exec/ast_free.c b/42sh/src/exec/ast_free.c index fdf827f7..4d7d2c93 100644 --- a/42sh/src/exec/ast_free.c +++ b/42sh/src/exec/ast_free.c @@ -6,11 +6,19 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/05 11:50:51 by jhalford #+# #+# */ -/* Updated: 2017/01/31 19:15:28 by wescande ### ########.fr */ +/* Updated: 2017/03/08 00:59:53 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" + +void read_redir(void *data) +{ + t_redir *redir; + + redir = data; + DG("file : [%s]", redir->word); +} void ast_free(void *data, size_t content_size) { @@ -18,15 +26,11 @@ void ast_free(void *data, size_t content_size) (void)content_size; node = data; - if (node->type == TK_COMMAND) - ft_ld_clear(&node->data.token, &ft_tabdel); - else if (node->type == TK_SUBSHELL) + if (node->type == CMD) { - ft_sstrfree(node->data.sstr); - node->data.sstr = NULL; - } - else if (node->type == TK_LESS || node->type == TK_GREAT || node->type == TK_DGREAT) - { - ft_strdel(&node->data.redir.word.word); + ft_ld_clear(&node->data.cmd.token, &ft_tabdel); +// ft_lstdel(&node->data.cmd.redir, &redir_free); } +// if (node->type == WORDLIST) +// do clear } diff --git a/42sh/src/main/sig_handler.c b/42sh/src/exec/error_badidentifier.c similarity index 61% rename from 42sh/src/main/sig_handler.c rename to 42sh/src/exec/error_badidentifier.c index d56b03ee..9238d892 100644 --- a/42sh/src/main/sig_handler.c +++ b/42sh/src/exec/error_badidentifier.c @@ -1,27 +1,21 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* sig_handler.c :+: :+: :+: */ +/* error_badidentifier.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ +/* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2016/12/01 12:43:22 by jhalford #+# #+# */ -/* Updated: 2016/12/03 13:31:33 by jhalford ### ########.fr */ +/* Created: 2017/03/06 18:03:51 by ariard #+# #+# */ +/* Updated: 2017/03/06 18:11:26 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -pid_t g_pid; - -void sig_handler(int signo) +int error_badidentifier(char *name) { - (void)signo; - if (signo == SIGINT) - { - if (g_pid) - kill(g_pid, SIGINT); - if (kill(g_pid, 0) == 0) - ft_putendl(""); - } + ft_putstr_fd("`", 2); + ft_putstr(name); + ft_putstr_fd("' not a valid identifier", 2); + return (1); } diff --git a/42sh/src/exec/exec_ampersand.c b/42sh/src/exec/exec_ampersand.c index 7dad7d31..d9b65bbf 100644 --- a/42sh/src/exec/exec_ampersand.c +++ b/42sh/src/exec/exec_ampersand.c @@ -6,20 +6,23 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 16:01:30 by jhalford #+# #+# */ -/* Updated: 2017/01/11 14:41:54 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 16:46:12 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int exec_ampersand(t_btree **ast) { - if (SH_HAS_JOBC(data_singleton()->opts)) - data_singleton()->exec.job.attributes |= JOB_BG; + t_exec *exec; + + if (!SH_HAS_JOBC(data_singleton()->opts)) + return (exec_semi(ast)); + exec = &data_singleton()->exec; + push(&exec->op_stack, TK_AMP); ft_exec(&(*ast)->left); - if (SH_HAS_JOBC(data_singleton()->opts)) - data_singleton()->exec.job.attributes &= ~JOB_BG; + exec->attrs &= ~EXEC_AOL_MASK; + exec->job.attrs &= ~JOB_BG; ft_exec(&(*ast)->right); - btree_delone(ast, &ast_free); return (0); } diff --git a/42sh/src/exec/exec_and_if.c b/42sh/src/exec/exec_and_if.c index 0728310d..b37c2fbc 100644 --- a/42sh/src/exec/exec_and_if.c +++ b/42sh/src/exec/exec_and_if.c @@ -6,32 +6,41 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 20:52:28 by jhalford #+# #+# */ -/* Updated: 2016/12/12 18:01:06 by jhalford ### ########.fr */ +/* Updated: 2017/03/05 15:18:41 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int exec_and_if(t_btree **ast) { - t_data *data; + /* t_data *data; */ + t_exec *exec; - data = data_singleton(); - if (data->exec.aol_status == NULL - || (data->exec.aol_search == TK_AND_IF - && *data->exec.aol_status == '0') - || (data->exec.aol_search == TK_OR_IF - && *data->exec.aol_status != '0')) - { - ft_exec(&(*ast)->left); - data->exec.aol_status = ft_getenv(data->env, "?"); - } - data->exec.aol_search = TK_AND_IF; - if (*data->exec.aol_status == '0' - || ((t_astnode*)(*ast)->right->item)->type != TK_COMMAND) - ft_exec(&(*ast)->right); - data->exec.aol_status = NULL; - data->exec.aol_search = 0; - btree_delone(ast, &ast_free); + exec = &data_singleton()->exec; + push(&exec->op_stack, TK_AND_IF); + ft_exec(&(*ast)->left); + exec->attrs &= ~EXEC_OR_IF; + exec->attrs |= EXEC_AND_IF; + ft_exec(&(*ast)->right); + + /* data = data_singleton(); */ + /* if (data->exec.aol_status == NULL */ + /* || (data->exec.aol_search == TK_AND_IF */ + /* && *data->exec.aol_status == '0') */ + /* || (data->exec.aol_search == TK_OR_IF */ + /* && *data->exec.aol_status != '0')) */ + /* { */ + /* ft_exec(&(*ast)->left); */ + /* data->exec.aol_status = ft_getenv(data->env, "?"); */ + /* } */ + /* data->exec.aol_search = TK_AND_IF; */ + /* if (*data->exec.aol_status == '0' */ + /* || ((t_astnode*)(*ast)->right->item)->type != TK_COMMAND) */ + /* ft_exec(&(*ast)->right); */ + /* data->exec.aol_status = NULL; */ + /* data->exec.aol_search = 0; */ + +// btree_delone(ast, &ast_free); return (0); } diff --git a/42sh/src/parser/parse_separator.c b/42sh/src/exec/exec_case_branch.c similarity index 50% rename from 42sh/src/parser/parse_separator.c rename to 42sh/src/exec/exec_case_branch.c index dc35483e..76596970 100644 --- a/42sh/src/parser/parse_separator.c +++ b/42sh/src/exec/exec_case_branch.c @@ -1,27 +1,39 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* parse_separator.c :+: :+: :+: */ +/* exec_case_branch.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ +/* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/28 16:21:51 by jhalford #+# #+# */ -/* Updated: 2016/12/03 13:32:14 by jhalford ### ########.fr */ +/* Created: 2017/03/07 20:33:45 by wescande #+# #+# */ +/* Updated: 2017/03/07 20:34:48 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "parser.h" +#include "minishell.h" -int parse_separator(t_btree **ast, t_list **start, t_list **lst) +int exec_case_branch(t_btree **ast) { - t_token *token; t_astnode *node; + char **av; + t_exec *exec; + int i; - token = (*lst)->content; + exec = &data_singleton()->exec; + if (EXEC_IS_CASE_BRANCH(exec->attrs)) + return (0); node = (*ast)->item; - node->type = token->type; - ft_parse(&(*ast)->right, &(*lst)->next); - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - ft_parse(&(*ast)->left, start); + av = token_to_argv(node->data.cmd.wordlist, 1); + i = 0; + while (av[i]) + { + if (ft_strcmp(av[i], ((char **)exec->case_pattern)[0]) == 0) + { + exec->attrs |= EXEC_CASE_BRANCH; + ft_exec(&(*ast)->right); + break ; + } + i++; + } return (0); } diff --git a/42sh/src/exec/exec_command.c b/42sh/src/exec/exec_command.c deleted file mode 100644 index 7790ccaa..00000000 --- a/42sh/src/exec/exec_command.c +++ /dev/null @@ -1,71 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* exec_command.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */ -/* Updated: 2017/03/03 16:19:31 by wescande ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "exec.h" - -static char **token_to_argv(t_astnode *node) -{ - char **my_tab; - int index; - char **expand; - char **content; - t_ld *ld; - - if (node->type == TK_COMMAND) - { - ld = node->data.token; - my_tab = NULL; - while (ld) - { - content = ld->content; - if ((expand = glob(content[0], (unsigned char *)content[1], (unsigned char *)content[2], 1))) - { - index = -1; - while (expand[++index]) - my_tab = ft_sstradd(my_tab, expand[index]); - ft_tabdel(&expand); - } - ld = ld->next; - } - return (my_tab); - } - else if (node->type == TK_SUBSHELL) - return (ft_sstrdup(node->data.sstr)); - return (NULL); -} - -int exec_command(t_btree **ast) -{ - t_astnode *node; - t_process *p; - t_job *job; - - node = (*ast)->item; - p = &data_singleton()->exec.process; - job = &data_singleton()->exec.job; - p->av = token_to_argv(node); - process_setexec(node->type, p); - if (!(launch_process(p))) - { - job_addprocess(p); - if (IS_PIPEEND(p->attributes)) - { - JOB_IS_FG(job->attributes) ? - put_job_in_foreground(job, 0): - put_job_in_background(job, 0); - job->pgid = 0; - } - } - process_reset(p); - btree_delone(ast, &ast_free); - return (0); -} diff --git a/42sh/src/exec/exec_redir.c b/42sh/src/exec/exec_elif.c similarity index 55% rename from 42sh/src/exec/exec_redir.c rename to 42sh/src/exec/exec_elif.c index 1f5c31b5..c4a5fa4a 100644 --- a/42sh/src/exec/exec_redir.c +++ b/42sh/src/exec/exec_elif.c @@ -1,27 +1,29 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* exec_redir.c :+: :+: :+: */ +/* exec_elif.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ +/* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 17:27:51 by jhalford #+# #+# */ -/* Updated: 2017/02/07 15:24:11 by jhalford ### ########.fr */ +/* Created: 2017/02/06 18:08:53 by ariard #+# #+# */ +/* Updated: 2017/03/04 17:45:29 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" -int exec_redir(t_btree **ast) +int exec_elif(t_btree **ast) { - t_astnode *node; - t_process *p; + t_exec *exec; - p = &data_singleton()->exec.process; - node = (*ast)->item; - node->data.redir.type = node->type; - ft_lsteadd(&p->redirs, ft_lstnew(&node->data.redir,sizeof(node->data.redir))); + exec = &data_singleton()->exec; + if (EXEC_IS_IF_BRANCH(exec->attrs)) + return (0); ft_exec(&(*ast)->left); - btree_delone(ast, &ast_free); + if (ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") == 0) + { + exec->attrs |= EXEC_IF_BRANCH; + ft_exec(&(*ast)->right); + } return (0); } diff --git a/42sh/src/exec/process_resetfds.c b/42sh/src/exec/exec_else.c similarity index 63% rename from 42sh/src/exec/process_resetfds.c rename to 42sh/src/exec/exec_else.c index dbc9403a..72e132b1 100644 --- a/42sh/src/exec/process_resetfds.c +++ b/42sh/src/exec/exec_else.c @@ -1,23 +1,25 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* process_resetfds.c :+: :+: :+: */ +/* exec_else.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ +/* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/07 17:39:14 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:50:52 by jhalford ### ########.fr */ +/* Created: 2017/02/06 18:55:07 by ariard #+# #+# */ +/* Updated: 2017/03/04 18:06:55 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void process_resetfds(void) +int exec_else(t_btree **ast) { t_exec *exec; exec = &data_singleton()->exec; - dup2(exec->fd0save, 0); - dup2(exec->fd1save, 1); - dup2(exec->fd2save, 2); + if (EXEC_IS_IF_BRANCH(exec->attrs)) + return (0); + exec->attrs |= EXEC_IF_BRANCH; + ft_exec(&(*ast)->left); + return (0); } diff --git a/42sh/src/exec/exec_leaf.c b/42sh/src/exec/exec_leaf.c new file mode 100644 index 00000000..3a242088 --- /dev/null +++ b/42sh/src/exec/exec_leaf.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* exec_leaf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 15:47:30 by wescande #+# #+# */ +/* Updated: 2017/03/08 20:31:12 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int exec_leaf(t_btree **ast) +{ + t_process p; + t_job *job; + + job = &data_singleton()->exec.job; + if (set_process(&p, *ast)) + return (1); + if (!(launch_process(&p))) + { + DG("forked pid=[%i], name=[%s]", p.pid, p.data.cmd.av[0]); + job_addprocess(&p); + if (IS_PIPEEND(p)) + { + if (JOB_IS_FG(job->attrs)) + put_job_in_foreground(job, 0); + else + put_job_in_background(job, 0); + job->pgid = 0; + } + } + if (p.fdout != STDOUT) + close(p.fdout); + return (0); +} diff --git a/42sh/src/exec/exec_math.c b/42sh/src/exec/exec_math.c new file mode 100644 index 00000000..7f9c994a --- /dev/null +++ b/42sh/src/exec/exec_math.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* exec_math.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 10:58:49 by ariard #+# #+# */ +/* Updated: 2017/03/07 16:00:24 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int get_math(char *stream, char **var, char **value, char **operator) +{ + char *temp; + + *var = ft_strduptr(stream, &ft_isalpha); + temp = ft_sstrstr(data_singleton()->env, *var); + if (temp) + { + temp += ft_strlenchr(temp, '=') + 1; + *value = ft_strdup(temp); + if (!(ft_stris(*value, &ft_isdigit))) + { + ft_strdel(value); + *value = ft_itoa(0); + } + } + else + *value = ft_itoa(0); + stream += ft_strlen(*var); + *operator = ft_strdup(stream); + return (0); +} + +static int do_math(char **value, char *operator) +{ + long ope1; + long ope2; + + ope1 = ft_atoi(*value); + if (operator[2]) + ope2 = ft_atoi(&operator[2]); + else + ope2 = 0; + if ((operator[0] == '/' || operator[0] == '%') && ope2 == 0) + ope1 = 0; + else + { + ope1 = (operator[0] == '+') ? ope1 + ope2 : ope1; + ope1 = (operator[0] == '-') ? ope1 - ope2 : ope1; + ope1 = (operator[0] == '/') ? ope1 / ope2 : ope1; + ope1 = (operator[0] == '*') ? ope1 * ope2 : ope1; + ope1 = (operator[0] == '%') ? ope1 % ope2 : ope1; + } + ft_strdel(value); + *value = ft_itoa(ope1); + return (0); +} + +int exec_math(t_btree **ast) +{ + t_astnode *node; + char **av; + char *var; + char *value; + char *operator; + + node = (*ast)->item; + av = token_to_argv(node->data.cmd.wordlist, 1); + get_math(av[0], &var, &value, &operator); + do_math(&value, operator); + builtin_setenv("setenv", (char *[]){var, value, 0}, data_singleton()->local_var); + return (0); +} diff --git a/42sh/src/exec/exec_or_if.c b/42sh/src/exec/exec_or_if.c index 6b18060c..50def42a 100644 --- a/42sh/src/exec/exec_or_if.c +++ b/42sh/src/exec/exec_or_if.c @@ -6,32 +6,41 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 21:06:17 by jhalford #+# #+# */ -/* Updated: 2017/01/02 18:10:21 by jhalford ### ########.fr */ +/* Updated: 2017/03/05 15:18:49 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int exec_or_if(t_btree **ast) { - t_data *data; + /* t_data *data; */ + t_exec *exec; - data = data_singleton(); - if (data->exec.aol_status == NULL - || (data->exec.aol_search == TK_AND_IF - && *data->exec.aol_status == '0') - || (data->exec.aol_search == TK_OR_IF - && *data->exec.aol_status != '0')) - { - ft_exec(&(*ast)->left); - data->exec.aol_status = ft_getenv(data->env, "?"); - } - data->exec.aol_search = TK_OR_IF; - if (*data->exec.aol_status != '0' - || ((t_astnode*)(*ast)->right->item)->type != TK_COMMAND) - ft_exec(&(*ast)->right); - data->exec.aol_status = NULL; - data->exec.aol_search = 0; - btree_delone(ast, &ast_free); + exec = &data_singleton()->exec; + push(&exec->op_stack, TK_OR_IF); + ft_exec(&(*ast)->left); + exec->attrs &= ~EXEC_AND_IF; + exec->attrs = EXEC_OR_IF; + ft_exec(&(*ast)->right); + + /* data = data_singleton(); */ + /* if (data->exec.aol_status == NULL */ + /* || (data->exec.aol_search == TK_AND_IF */ + /* && *data->exec.aol_status == '0') */ + /* || (data->exec.aol_search == TK_OR_IF */ + /* && *data->exec.aol_status != '0')) */ + /* { */ + /* ft_exec(&(*ast)->left); */ + /* data->exec.aol_status = ft_getenv(data->env, "?"); */ + /* } */ + /* data->exec.aol_search = TK_OR_IF; */ + /* if (*data->exec.aol_status != '0' */ + /* || ((t_astnode*)(*ast)->right->item)->type != TK_COMMAND) */ + /* ft_exec(&(*ast)->right); */ + /* data->exec.aol_status = NULL; */ + /* data->exec.aol_search = 0; */ + +// btree_delone(ast, &ast_free); return (0); } diff --git a/42sh/src/exec/exec_pipe.c b/42sh/src/exec/exec_pipe.c index c68a0bc3..3668da9e 100644 --- a/42sh/src/exec/exec_pipe.c +++ b/42sh/src/exec/exec_pipe.c @@ -6,43 +6,20 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 21:13:23 by jhalford #+# #+# */ -/* Updated: 2017/02/17 14:36:28 by jhalford ### ########.fr */ +/* Updated: 2017/03/03 16:27:48 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int exec_pipe(t_btree **ast) { - int fds[2]; - int start; - t_data *data; - t_process *p; + t_exec *exec; - data = data_singleton(); - p = &data_singleton()->exec.process; - pipe(fds); - /* DG("pipe %i->%i", fds[PIPE_WRITE], fds[PIPE_READ]); */ - p->fdout = fds[PIPE_WRITE]; - start = IS_PIPESTART(p->attributes); - p->toclose = fds[PIPE_READ]; - - p->attributes &= ~PROCESS_PIPEEND; + exec = &data_singleton()->exec; + push(&exec->op_stack, TK_PIPE); ft_exec(&(*ast)->left); - p->attributes &= ~PROCESS_PIPESTART; - - p->toclose = STDIN; - close(fds[PIPE_WRITE]); - p->fdout = STDOUT; - p->fdin = fds[PIPE_READ]; - - p->attributes |= PROCESS_PIPEEND; ft_exec(&(*ast)->right); - if (start) - p->attributes |= PROCESS_PIPESTART; - - close(fds[PIPE_READ]); - p->fdin = STDIN; - btree_delone(ast, &ast_free); + /* btree_delone(ast, &ast_free); */ return (0); } diff --git a/42sh/src/main/ft_cleanup.c b/42sh/src/exec/exec_reset.c similarity index 55% rename from 42sh/src/main/ft_cleanup.c rename to 42sh/src/exec/exec_reset.c index 7cf6aa3b..2b925196 100644 --- a/42sh/src/main/ft_cleanup.c +++ b/42sh/src/exec/exec_reset.c @@ -1,31 +1,31 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_cleanup.c :+: :+: :+: */ +/* exec_reset.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2016/12/01 14:42:42 by jhalford #+# #+# */ -/* Updated: 2016/12/09 21:50:38 by jhalford ### ########.fr */ +/* Created: 2017/03/08 14:31:42 by jhalford #+# #+# */ +/* Updated: 2017/03/08 14:45:10 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -extern char **environ; -extern char PC; -extern char *UP; -extern char *BC; - -void ft_cleanup(void) +int exec_reset(void) { - struct termios term; + t_exec *exec; - DG("cleanup. char * UP at %p", UP); - DG("cleanup. char * BC at %p", BC); - if (tcgetattr(0, &term) == -1) - return ; - term.c_lflag |= ICANON | ISIG | ECHO; - if (tcsetattr(0, TCSANOW, &term) == -1) - return ; + exec = &data_singleton()->exec; + exec->fd_save[0] = fcntl(0, F_DUPFD_CLOEXEC); + exec->fd_save[1] = fcntl(1, F_DUPFD_CLOEXEC); + exec->fd_save[2] = fcntl(2, F_DUPFD_CLOEXEC); + exec->op_stack = NULL; + exec->fdin = STDIN; + exec->attrs = 0; + exec->job.id = 0; + exec->job.pgid = 0; + exec->job.attrs = 0; + exec->job.first_process = NULL; + return (0); } diff --git a/42sh/src/exec/exec_semi.c b/42sh/src/exec/exec_semi.c index 335ac2ac..7f8b91ce 100644 --- a/42sh/src/exec/exec_semi.c +++ b/42sh/src/exec/exec_semi.c @@ -6,16 +6,20 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 20:52:05 by jhalford #+# #+# */ -/* Updated: 2016/12/12 18:00:21 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 16:41:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int exec_semi(t_btree **ast) { + t_exec *exec; + + exec = &data_singleton()->exec; + push(&exec->op_stack, TK_SEMI); ft_exec(&(*ast)->left); + exec->attrs &= ~EXEC_AOL_MASK; ft_exec(&(*ast)->right); - btree_delone(ast, &ast_free); return (0); } diff --git a/42sh/src/exec/exec_var.c b/42sh/src/exec/exec_var.c new file mode 100644 index 00000000..578422d2 --- /dev/null +++ b/42sh/src/exec/exec_var.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* exec_var.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 11:12:05 by ariard #+# #+# */ +/* Updated: 2017/03/07 18:37:38 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int set_var(char *stream, char **var, char **value) +{ + *var = ft_strdupchr(stream, '='); + stream += ft_strlenchr(stream, '=') + 1; + *value = ft_strdup(stream); + return (0); +} + +int exec_var(t_btree **ast) +{ + t_astnode *node; + char **av; + char *var; + char *value; + + node = (*ast)->item; + av = token_to_argv(node->data.cmd.token, 1); + set_var(av[0], &var, &value); + builtin_setenv("setenv", (char*[]){var, value, 0}, data_singleton()->local_var); + return (0); +} diff --git a/42sh/src/exec/fd_is_valid.c b/42sh/src/exec/fd_is_valid.c index bcb6cdda..39fac840 100644 --- a/42sh/src/exec/fd_is_valid.c +++ b/42sh/src/exec/fd_is_valid.c @@ -6,13 +6,16 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/03 13:46:40 by jhalford #+# #+# */ -/* Updated: 2017/02/06 22:54:19 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 16:58:38 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int fd_is_valid(int fd) +int fd_is_valid(int fd, int has_flag) { - return (fcntl(fd, F_GETFD) != -1 || errno != EBADF); + int flags; + + flags = fcntl(fd, F_GETFD); + return ((flags != -1 || errno != EBADF) && flags & has_flag); } diff --git a/42sh/src/exec/ft_exec.c b/42sh/src/exec/ft_exec.c index c1daa008..34a242b5 100644 --- a/42sh/src/exec/ft_exec.c +++ b/42sh/src/exec/ft_exec.c @@ -6,21 +6,32 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */ -/* Updated: 2017/02/06 15:27:19 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 11:57:19 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" -t_execmap g_execmap[] = +t_itof g_execmap[] = { - {TK_AND_IF, &exec_and_if}, - {TK_OR_IF, &exec_or_if}, + {TK_NEWLINE, &exec_semi}, {TK_SEMI, &exec_semi}, {TK_AMP, &exec_ampersand}, + {TK_AND_IF, &exec_and_if}, + {TK_OR_IF, &exec_or_if}, {TK_PIPE, &exec_pipe}, - {TK_REDIR, &exec_redir}, - {TK_COMMAND | TK_SUBSHELL, &exec_command}, + {TK_WHILE, &exec_leaf}, + {TK_IF, &exec_leaf}, + {TK_ELIF, &exec_elif}, + {TK_ELSE, &exec_else}, + {TK_UNTIL, &exec_leaf}, + {TK_FOR, &exec_leaf}, + {TK_CASE, &exec_leaf}, + {TK_PAREN_OPEN, &exec_case_branch}, + {TK_ASSIGNEMENT_WORD, &exec_var}, + {MATH, &exec_math}, + {SUBSHELL, &exec_leaf}, + {CMD, &exec_leaf}, {0, 0}, }; @@ -33,10 +44,10 @@ int ft_exec(t_btree **ast) if (!*ast) return (0); item = (*ast)->item; - while (g_execmap[i].type) + while (g_execmap[i].id) { - if (item->type & g_execmap[i].type) - (*g_execmap[i].f)(ast); + if (item->type == g_execmap[i].id) + return ((*g_execmap[i].f)(ast)); i++; } return (0); diff --git a/42sh/src/exec/is_function.c b/42sh/src/exec/is_function.c new file mode 100644 index 00000000..36bdcd5a --- /dev/null +++ b/42sh/src/exec/is_function.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* is_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 02:45:15 by wescande #+# #+# */ +/* Updated: 2017/03/08 03:22:34 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_btree *is_function(t_process *p) +{ + t_list *tmp; + + tmp = data_singleton()->lst_func; + while (tmp) + { + if (!ft_strcmp(((t_astnode *)tmp->content)->data.str, p->data.cmd.av[0])) + return (btree_map(p->data.subshell.content, node_copy)); + tmp = tmp->next; + } + return (NULL); +} diff --git a/42sh/src/exec/launch_builtin.c b/42sh/src/exec/launch_builtin.c new file mode 100644 index 00000000..0c80ecbe --- /dev/null +++ b/42sh/src/exec/launch_builtin.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_builtin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 15:48:24 by jhalford #+# #+# */ +/* Updated: 2017/03/08 15:10:49 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int launch_builtin(t_process *p) +{ + pid_t pid; + + if (IS_PIPESINGLE(*p)) + { + if (process_redirect(p)) + return (0); + set_exitstatus((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env), 1); + return (0); + } + pid = fork(); + if (pid == 0) + { + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset();///A FAIRE POUR LES BUILTIN OU PAS ? -> Q de William + exit((*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env)); + } + else if (pid > 0) + return (pid); + else if (pid == -1) + ft_dprintf(2, "{red}%s: internal fork error{eoc}\n", SHELL_NAME); + return (0); +} diff --git a/42sh/src/exec/launch_case.c b/42sh/src/exec/launch_case.c new file mode 100644 index 00000000..6f248ae0 --- /dev/null +++ b/42sh/src/exec/launch_case.c @@ -0,0 +1,73 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_case.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 19:02:23 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:11:02 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" +/* +int exec_case(t_btree **ast) +{ + t_astnode *node; + char **av; + t_exec *exec; + + (void)ast; + exec = &data_singleton()->exec; + exec->attrs &= ~EXEC_CASE_BRANCH; + + node = (*ast)->item; + av = token_to_argv(node->data.cmd.wordlist, 1); + exec->case_pattern = av; + return (0); +} +*/ + +static int do_case(t_process *p) +{ + t_exec *exec; + + exec = &data_singleton()->exec; + exec->attrs &= ~EXEC_CASE_BRANCH; + exec->case_pattern = token_to_argv(p->data.d_case.list_word, 1); +/* ft_exec(&p->data.d_if.condition); + if (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0"))) + { + exec->attrs |= EXEC_IF_BRANCH; + ft_exec(&p->data.d_if.content); + } + return (ft_atoi(ft_getenv(data_singleton()->env, "?")));*/ + return (0); +} + +int launch_case(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + exit(do_case(p)); + } + else if (pid > 0) + return (pid); + } + else + do_case(p); + return (0); +} diff --git a/42sh/src/exec/launch_file.c b/42sh/src/exec/launch_file.c new file mode 100644 index 00000000..249c49d1 --- /dev/null +++ b/42sh/src/exec/launch_file.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_file.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 14:53:31 by jhalford #+# #+# */ +/* Updated: 2017/03/08 17:35:42 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int launch_file(t_process *p) +{ + int pid; + + /* DG("in file"); */ + pid = fork(); + if (pid == 0) + { + if (!p->data.cmd.path) + { + ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]); + exit(127); + } + else if (!p->data.cmd.stat) + { + ft_dprintf(2, "{red}%s: %s: no such file or directory\n", SHELL_NAME, p->data.cmd.av[0]); + exit(127); + } + else if (S_ISDIR(p->data.cmd.stat->st_mode)) + { + ft_dprintf(2, "{red}%s: %s: Is a directory{eoc}\n", SHELL_NAME, p->data.cmd.av[0]); + exit(126); + } + else if (access(p->data.cmd.path, X_OK) == -1) + { + ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]); + exit(126); + } + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + (*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env); + ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]); + exit(42); + } + else if (pid > 0) + return (pid); + else if (pid == -1) + ft_dprintf(2, "{red}%s: internal fork error{eoc}\n", SHELL_NAME); + return (0); +} diff --git a/42sh/src/exec/launch_for.c b/42sh/src/exec/launch_for.c new file mode 100644 index 00000000..0c39ac59 --- /dev/null +++ b/42sh/src/exec/launch_for.c @@ -0,0 +1,97 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_for.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 17:34:43 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:07:55 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int do_for(t_process *p) +{ + t_ld *temp; + int i; + char **av; + char *var; + + temp = p->data.d_for.list_word; + var = ((char **)temp->content)[0]; + if (!word_is_assignment(temp->content)) + return (error_badidentifier(var)); + temp = temp->next; + while (temp) + { + i = -1; + av = token_to_argv(temp, 1); + while (av[++i]) + { + builtin_setenv("setenv", (char*[]){var, av[i], 0}, + data_singleton()->local_var); + ft_exec(&p->data.d_for.content); + i++; + } + temp = temp->next; + } + return (ft_atoi(ft_getenv(data_singleton()->env, "?"))); +} + +int launch_for(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + exit(do_for(p)); + } + else if (pid > 0) + return (pid); + } + else + do_for(p); + return (0); +} +/* + int exec_for(t_btree **ast) + { + t_astnode *node; + t_ld *temp; + char **av; + char *var; + int i; + + node = (*ast)->item; + temp = node->data.cmd.wordlist; + var = ((char **)(temp->content))[0]; + if (ft_isdigit(var[0])) + return (error_badidentifier(var)); + temp = temp->next; + while (temp) + { + i = 0; + av = token_to_argv(temp, 1); + while (av[i]) + { + builtin_setenv("setenv", (char*[]){var, av[i], 0}, + data_singleton()->local_var); + ft_exec(&(*ast)->right); + i++; + } + temp = temp->next; + } + return (0); + }*/ diff --git a/42sh/src/exec/launch_function.c b/42sh/src/exec/launch_function.c new file mode 100644 index 00000000..74678b8e --- /dev/null +++ b/42sh/src/exec/launch_function.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 03:23:59 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:08:20 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int do_function(t_process *p) +{ + ft_exec(&p->data.function.content); + return (ft_atoi(ft_getenv(data_singleton()->env, "?"))); +} + +int launch_function(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + exit(do_function(p)); + } + else if (pid > 0) + return (pid); + } + else + do_function(p); + return (0); +} diff --git a/42sh/src/exec/launch_if.c b/42sh/src/exec/launch_if.c new file mode 100644 index 00000000..7d389d56 --- /dev/null +++ b/42sh/src/exec/launch_if.c @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_if.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 17:26:53 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:07:47 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int do_if(t_process *p) +{ + t_exec *exec; + + exec = &data_singleton()->exec; + exec->attrs &= ~EXEC_IF_BRANCH; + ft_exec(&p->data.d_if.condition); + if (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0"))) + { + exec->attrs |= EXEC_IF_BRANCH; + ft_exec(&p->data.d_if.content); + } + return (ft_atoi(ft_getenv(data_singleton()->env, "?"))); +} + +int launch_if(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + exit(do_if(p)); + } + else if (pid > 0) + return (pid); + } + else + do_if(p); + return (0); +} +/* +int exec_if(t_btree **ast) +{ + t_exec *exec; + + exec = &data_singleton()->exec; + + exec->attrs &= ~EXEC_IF_BRANCH; + ft_exec(&(*ast)->left); + if (ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") == 0) + { + exec->attrs |= EXEC_IF_BRANCH; + ft_exec(&(*ast)->right); + } + return (0); +}*/ diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index 902735ab..68a56e29 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -6,58 +6,39 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */ -/* Updated: 2017/03/07 15:20:46 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:43:18 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +t_itof g_launchmap[] = +{ + {PROCESS_FUNCTION, launch_function}, + {PROCESS_BUILTIN, launch_builtin}, + {PROCESS_FILE, launch_file}, + {PROCESS_SUBSHELL, launch_subshell}, + {PROCESS_WHILE, launch_while}, + {PROCESS_UNTIL, launch_until}, + {PROCESS_IF, launch_if}, + {PROCESS_FOR, launch_for}, + {PROCESS_CASE, launch_case}, +}; + int launch_process(t_process *p) { - t_exec *exec; - int pid; + int pid; - exec = &data_singleton()->exec; - if (p->attributes & PROCESS_UNKNOWN) - { - ft_dprintf(2, "{red}%s: command not found: %s{eoc}\n", SHELL_NAME, p->av[0]); - set_exitstatus(127, 1); - } - else if (p->attributes & PROCESS_BUILTIN && IS_PIPESINGLE(p->attributes)) - { - if (process_redirect(p)) - return (1); - set_exitstatus((*p->execf)(p->path, p->av, data_singleton()->env), 1); - } - else - { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_RUNNING; - if (p->attributes & (PROCESS_BINARY | PROCESS_SCRIPT) - && access(p->path, X_OK) == -1) - { - ft_dprintf(2, "{red}%s: permission denied: %s{eoc}\n", SHELL_NAME, p->av[0]); - set_exitstatus(126, 1); - return (1); - } - pid = fork(); - if (pid == 0) - { - process_setgroup(p, 0); - process_setsig(); - if (process_redirect(p)) - exit (1); - (*p->execf)(p->path, p->av, data_singleton()->env); - exit(43); - } - else if (pid > 0) - { - p->pid = pid; - process_setgroup(p, pid); - return (0); - } - else if (pid == -1) - ft_dprintf(2, "{red}%s: internal fork error{eoc}\n", SHELL_NAME); - } - return (1); + DG("launchprocess"); + if (p->type >= PROCESS_MAX) + return (-1); + if (!g_launchmap[p->type].f) + return (-1); + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_RUNNING; + if (!(pid = (*g_launchmap[p->type].f)(p))) + return (-1); + p->pid = pid; + process_setgroup(p, pid); + return (0); } diff --git a/42sh/src/exec/launch_subshell.c b/42sh/src/exec/launch_subshell.c new file mode 100644 index 00000000..1c2703b1 --- /dev/null +++ b/42sh/src/exec/launch_subshell.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_subshell.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 00:11:44 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:08:04 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int do_subshell(t_process *p) +{ + ft_exec(&p->data.subshell.content); + return (ft_atoi(ft_getenv(data_singleton()->env, "?"))); +} + +int launch_subshell(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + exit(do_subshell(p)); + } + else if (pid > 0) + return (pid); + } + else + do_subshell(p); + return (0); +} diff --git a/42sh/src/exec/launch_until.c b/42sh/src/exec/launch_until.c new file mode 100644 index 00000000..4c0f566d --- /dev/null +++ b/42sh/src/exec/launch_until.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_until.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 22:04:42 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:08:13 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +static int do_until(t_process *p) +{ + int ret; + + ft_exec(&p->data.d_until.condition); + ret = ft_atoi(ft_getenv(data_singleton()->env, "?")); + while (ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0")) + { + ft_exec(&p->data.d_until.content); + ret = ft_atoi(ft_getenv(data_singleton()->env, "?")); + ft_exec(&p->data.d_until.condition); + } + return (ret); +} + +int launch_until(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + exit(do_until(p)); + } + else if (pid > 0) + return (pid); + } + else + do_until(p); + return (0); +} diff --git a/42sh/src/exec/launch_while.c b/42sh/src/exec/launch_while.c new file mode 100644 index 00000000..462edb8b --- /dev/null +++ b/42sh/src/exec/launch_while.c @@ -0,0 +1,71 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* launch_while.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 17:20:53 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:18:36 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" +/* +int exec_while(t_btree **ast) +{ + int ret; + DG("exec while condition"); + ft_exec(&(*ast)->left); + DG("ret :[%s]", ft_getenv(data_singleton()->env, "?")); + while (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0"))) + { + DG("in the while"); + ft_exec(&(*ast)->right); + ret = ft_atoi(ft_getenv(data_singleton()->env, "?")); + ft_exec(&(*ast)->left); + } + exit(ret); + return (0); +} +*/ +static int do_while(t_process *p) +{ + int ret; + + ft_exec(&p->data.d_while.condition); + ret = ft_atoi(ft_getenv(data_singleton()->env, "?")); + while (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0"))) + { + ft_exec(&p->data.d_while.content); + ret = ft_atoi(ft_getenv(data_singleton()->env, "?")); + ft_exec(&p->data.d_while.condition); + } + return (ret); +} + +int launch_while(t_process *p) +{ + pid_t pid; + + if (SH_IS_INTERACTIVE(data_singleton()->opts)) + { + pid = fork(); + if (pid == 0) + { + data_singleton()->opts &= ~SH_INTERACTIVE; + data_singleton()->opts &= ~SH_OPTS_JOBC; + process_setgroup(p, 0); + process_setsig(); + if (process_redirect(p)) + exit (1); + exec_reset(); + exit(do_while(p)); + } + else if (pid > 0) + return (pid); + } + else + do_while(p); + return (0); +} diff --git a/42sh/src/job-control/process_mark_status.c b/42sh/src/exec/mark_process_status.c similarity index 72% rename from 42sh/src/job-control/process_mark_status.c rename to 42sh/src/exec/mark_process_status.c index fd285c0b..c2e7dd97 100644 --- a/42sh/src/job-control/process_mark_status.c +++ b/42sh/src/exec/mark_process_status.c @@ -6,39 +6,42 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 12:41:11 by jhalford #+# #+# */ -/* Updated: 2017/02/03 15:50:29 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 18:49:49 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" -int process_mark_status(pid_t pid, int status) +int mark_process_status(pid_t pid, int status) { t_list *plist; t_process *p; + DG("MPS pid=%i,s=%i", pid, status); if (pid > 1) { if ((plist = job_getprocess(pid))) { p = plist->content; p->status = status; + DG("marking pid=[%i], name=[%s]", p->pid, p->data.cmd.av[0]); if (WIFSTOPPED(status)) { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_SUSPENDED; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_SUSPENDED; } else { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_COMPLETED; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_COMPLETED; if (WIFSIGNALED(status)) ft_printf("{mag}%d: Terminated by signal %d.\n{eoc}", (int)pid, WTERMSIG(status)); } return (0); } - ft_dprintf(2, "No child process %d.\n", pid); + ft_dprintf(2, "{red}No child process %d.\n", pid); + return (0); } return (-1); } diff --git a/42sh/src/exec/node_copy.c b/42sh/src/exec/node_copy.c new file mode 100644 index 00000000..6c010038 --- /dev/null +++ b/42sh/src/exec/node_copy.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* node_copy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 03:38:36 by wescande #+# #+# */ +/* Updated: 2017/03/08 12:01:07 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void *node_copy(void *data) +{ + t_astnode *new; + t_astnode *old; + + if (!data) + return (NULL); + old = data; + new = (t_astnode *)ft_memalloc(sizeof(t_astnode)); + new->nest = old->nest; + new->full = old->full; + new->type = old->type; + new->pattern = old->pattern; + if (old->type == CMD || old->type == TK_ASSIGNEMENT_WORD) + { + new->data.cmd.redir = ft_lstmap(old->data.cmd.redir, &redir_copy); + new->data.cmd.token = ft_ld_copy(old->data.cmd.token, &tab_esc_copy); + } + if (old->type == TK_FOR || old->type == TK_PAREN_OPEN || old->type == TK_CASE) + new->data.cmd.wordlist = ft_ld_copy(old->data.cmd.token, &tab_esc_copy); + return (new); +} diff --git a/42sh/src/exec/process_redirect.c b/42sh/src/exec/process_redirect.c index 33654306..c62cc0c8 100644 --- a/42sh/src/exec/process_redirect.c +++ b/42sh/src/exec/process_redirect.c @@ -6,13 +6,13 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/29 16:04:18 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:36:46 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 21:04:38 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" -t_redirmap g_redirmap[] = +t_itof g_redirmap[] = { {TK_LESS, redirect_less}, {TK_GREAT, redirect_great}, @@ -33,12 +33,15 @@ int process_redirect(t_process *p) while (redirs) { redir = redirs->content; + DG("redir type :%s", read_state(redir->type)); + DG("redir word : %s", redir->word); if (redir->n > 9) return (bad_fd(redir->n)); i = 0; - while (g_redirmap[i].type) + while (g_redirmap[i].id) { - if (g_redirmap[i].type == redir->type) + DG("process redirect"); + if (g_redirmap[i].id == redir->type) { if ((g_redirmap[i].f)(redir)) return (1); @@ -48,12 +51,11 @@ int process_redirect(t_process *p) } redirs = redirs->next; } - if (p->toclose != STDIN) - close(p->toclose); + if (p->to_close != STDIN) + close(p->to_close); if (p->fdin != STDIN) dup2_close(p->fdin, STDIN); if (p->fdout != STDOUT) dup2_close(p->fdout, STDOUT); - ft_lstdel(&p->redirs, ft_lst_cfree); return (0); } diff --git a/42sh/src/exec/process_reset.c b/42sh/src/exec/process_reset.c index b90a131e..7e12b8b3 100644 --- a/42sh/src/exec/process_reset.c +++ b/42sh/src/exec/process_reset.c @@ -6,17 +6,22 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/07 17:44:22 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:48:22 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 14:51:19 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" void process_reset(t_process *p) { - process_resetfds(); - p->av = NULL; +// p->av = NULL; +// p->path = NULL; +// p->execf = NULL; p->pid = 0; + p->fdin = STDIN; + p->fdout = STDOUT; + p->to_close = 0; p->redirs = NULL; - p->attributes &= ~(PROCESS_STATE_MASK | PROCESS_TYPE_MASK); + p->status = -1; + p->attrs = 0; } diff --git a/42sh/src/exec/process_setexec.c b/42sh/src/exec/process_setexec.c deleted file mode 100644 index 348a2f30..00000000 --- a/42sh/src/exec/process_setexec.c +++ /dev/null @@ -1,46 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* process_setexec.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/12/13 17:07:10 by jhalford #+# #+# */ -/* Updated: 2017/02/18 13:24:16 by gwojda ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -int process_setexec(t_type type, t_process *p) -{ - p->path = NULL; - if (type == TK_SUBSHELL) - { - p->execf = &execve; - p->attributes |= PROCESS_SUBSHELL; - p->path = ft_strdup(p->av[0]); - } - else if ((p->execf = is_builtin(p))) - { - p->attributes |= PROCESS_BUILTIN; - } - else if (ft_strchr(p->av[0], '/')) - { - p->execf = &execve; - p->attributes |= PROCESS_SCRIPT; - p->path = ft_strdup(p->av[0]); - } - else if (ft_hash(p)) - { - p->execf = &execve; - p->attributes |= PROCESS_BINARY; - } - else - { - p->execf = NULL; - p->attributes |= PROCESS_UNKNOWN; - return (1); - } - return (0); -} diff --git a/42sh/src/exec/process_setgroup.c b/42sh/src/exec/process_setgroup.c index a7ada487..e255b3ed 100644 --- a/42sh/src/exec/process_setgroup.c +++ b/42sh/src/exec/process_setgroup.c @@ -6,12 +6,12 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 17:48:10 by jhalford #+# #+# */ -/* Updated: 2017/01/11 14:45:36 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:53:48 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" -#include "exec.h" +#include "minishell.h" +#include "minishell.h" int process_setgroup(t_process *p, pid_t pid) { @@ -26,7 +26,7 @@ int process_setgroup(t_process *p, pid_t pid) if (!j->pgid) j->pgid = pid ? pid : getpid(); setpgid(pid, j->pgid); - if (pid == 0 && JOB_IS_FG(j->attributes)) + if (pid == 0 && JOB_IS_FG(j->attrs)) tcsetpgrp(STDIN, j->pgid); return (0); } diff --git a/42sh/src/exec/process_setsig.c b/42sh/src/exec/process_setsig.c index b2a68b09..821137ea 100644 --- a/42sh/src/exec/process_setsig.c +++ b/42sh/src/exec/process_setsig.c @@ -1,4 +1,4 @@ -#include "exec.h" +#include "minishell.h" void process_setsig(void) { diff --git a/42sh/src/exec/redir_copy.c b/42sh/src/exec/redir_copy.c new file mode 100644 index 00000000..3dea51e4 --- /dev/null +++ b/42sh/src/exec/redir_copy.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redir_copy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 00:02:58 by ariard #+# #+# */ +/* Updated: 2017/03/08 11:53:26 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void *redir_copy(void *data) +{ + t_redir *old; + t_redir *new; + + if (!data) + return (NULL); + old = data; + new = (t_redir *)ft_memalloc(sizeof(t_redir)); + new->type = old->type; + new->n = old->n; + new->word = ft_strdup(old->word); + return (new); +} diff --git a/42sh/src/exec/redir_free.c b/42sh/src/exec/redir_free.c new file mode 100644 index 00000000..54f40a65 --- /dev/null +++ b/42sh/src/exec/redir_free.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redir_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/03 18:12:57 by ariard #+# #+# */ +/* Updated: 2017/03/08 12:40:34 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void redir_free(void *data, size_t content_size) +{ + t_redir *redir; + + (void)content_size; + redir = data; + if (redir->type == TK_GREAT || redir->type == TK_LESS || redir->type == TK_DGREAT) + { + ft_strdel(&redir->word); + } + free(redir); +} diff --git a/42sh/src/exec/redirect_dgreat.c b/42sh/src/exec/redirect_dgreat.c index 62e01058..66fc6881 100644 --- a/42sh/src/exec/redirect_dgreat.c +++ b/42sh/src/exec/redirect_dgreat.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 22:07:37 by jhalford #+# #+# */ -/* Updated: 2017/02/06 22:27:10 by jhalford ### ########.fr */ +/* Updated: 2017/03/05 18:10:36 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int redirect_dgreat(t_redir *redir) { @@ -18,7 +18,7 @@ int redirect_dgreat(t_redir *redir) int fdnew; fdnew = redir->n; - if ((fdold = open(redir->word.word, + if ((fdold = open(redir->word, O_WRONLY | O_CREAT | O_APPEND, 0644)) < 0) { DG("open errno=%i", errno); diff --git a/42sh/src/exec/redirect_dless.c b/42sh/src/exec/redirect_dless.c index 241f6e1f..9a1a7873 100644 --- a/42sh/src/exec/redirect_dless.c +++ b/42sh/src/exec/redirect_dless.c @@ -5,12 +5,11 @@ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/06 22:09:53 by jhalford #+# #+# */ /* Updated: 2017/02/07 16:05:09 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int redirect_dless(t_redir *redir) { @@ -18,7 +17,7 @@ int redirect_dless(t_redir *redir) char *str; pipe(fds); - str = redir->word.word; + str = redir->word; write(fds[PIPE_WRITE], str, ft_strlen(str)); close(fds[PIPE_WRITE]); dup2(fds[PIPE_READ], 0); diff --git a/42sh/src/exec/redirect_great.c b/42sh/src/exec/redirect_great.c index bd6e170a..13810ae4 100644 --- a/42sh/src/exec/redirect_great.c +++ b/42sh/src/exec/redirect_great.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 22:03:53 by jhalford #+# #+# */ -/* Updated: 2017/02/06 22:42:05 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 14:58:57 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int redirect_great(t_redir* redir) { @@ -18,7 +18,8 @@ int redirect_great(t_redir* redir) int fdnew; fdnew = redir->n; - if ((fdold = open(redir->word.word, + DG("redir great"); + if ((fdold = open(redir->word, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0) { DG("open errno=%i", errno); diff --git a/42sh/src/exec/redirect_greatand.c b/42sh/src/exec/redirect_greatand.c index 70658424..d2bf02aa 100644 --- a/42sh/src/exec/redirect_greatand.c +++ b/42sh/src/exec/redirect_greatand.c @@ -6,30 +6,34 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 22:12:31 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:54:40 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 16:54:43 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int redirect_greatand(t_redir *redir) { int fdold; int fdnew; - DG("redir greatand"); - if (redir->close) + if (ft_strcmp(redir->word, "-")) { close(redir->n); return (0); } - if (redir->word.fd == redir->n) - return (0); - if (redir->word.fd > 9) - return (bad_fd(redir->word.fd)); - fdold = redir->word.fd; + if (!ft_stris(redir->word, ft_isdigit)) + { + ft_dprintf(2, "%s: %s: can only be digits", SHELL_NAME, redir->word); + return (1); + } + fdold = ft_atoi(redir->word); fdnew = redir->n; - if (fd_is_valid(fdold)) + if (fdold == fdnew) + return (0); + if (fdold > 9) + return (bad_fd(fdold)); + if (fd_is_valid(fdold, O_RDONLY)) dup2_close(fdold, fdnew); else return (bad_fd(fdold)); diff --git a/42sh/src/exec/redirect_less.c b/42sh/src/exec/redirect_less.c index 38fda3bd..2a1e6809 100644 --- a/42sh/src/exec/redirect_less.c +++ b/42sh/src/exec/redirect_less.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 22:09:53 by jhalford #+# #+# */ -/* Updated: 2017/02/07 16:05:09 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 15:05:40 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int redirect_less(t_redir *redir) { @@ -18,10 +18,11 @@ int redirect_less(t_redir *redir) int fdnew; fdnew = redir->n; - if ((fdold = open(redir->word.word, O_RDONLY)) < 0) + DG("redirect less"); + if ((fdold = open(redir->word, O_RDONLY)) < 0) { ft_dprintf(2, "{red}%s: no such file or directory: %s{eoc}\n", - SHELL_NAME, redir->word.word); + SHELL_NAME, redir->word); exit (1); } dup2(fdold, fdnew); diff --git a/42sh/src/exec/redirect_lessand.c b/42sh/src/exec/redirect_lessand.c index 15da4123..9c184b82 100644 --- a/42sh/src/exec/redirect_lessand.c +++ b/42sh/src/exec/redirect_lessand.c @@ -6,33 +6,35 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 22:11:18 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:54:57 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 16:53:29 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "exec.h" +#include "minishell.h" int redirect_lessand(t_redir *redir) { int fdold; int fdnew; - if (redir->close) + if (ft_strcmp(redir->word, "-")) { close(redir->n); return (0); } - if (redir->word.fd == redir->n) - return (0); - if (redir->word.fd > 9) - return (bad_fd(redir->word.fd)); - fdold = redir->word.fd; - fdnew = redir->n; - if (fd_is_valid(fdold)) + if (!ft_stris(redir->word, ft_isdigit)) { - dup2(fdold, fdnew); - close(fdold); + ft_dprintf(2, "%s: %s: can only be digits", SHELL_NAME, redir->word); + return (1); } + fdold = ft_atoi(redir->word); + fdnew = redir->n; + if (fdold == fdnew) + return (0); + if (fdold > 9) + return (bad_fd(fdold)); + if (fd_is_valid(fdold, O_WRONLY)) + dup2_close(fdold, fdnew); else return (bad_fd(fdold)); return (0); diff --git a/42sh/src/exec/set_exitstatus.c b/42sh/src/exec/set_exitstatus.c index b38da178..efbbba45 100644 --- a/42sh/src/exec/set_exitstatus.c +++ b/42sh/src/exec/set_exitstatus.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:25:17 by jhalford #+# #+# */ -/* Updated: 2017/02/07 16:04:57 by jhalford ### ########.fr */ +/* Updated: 2017/02/27 23:20:22 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/set_process.c b/42sh/src/exec/set_process.c new file mode 100644 index 00000000..cf7f2fbf --- /dev/null +++ b/42sh/src/exec/set_process.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/05 14:54:45 by jhalford #+# #+# */ +/* Updated: 2017/03/08 16:46:51 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int set_process(t_process *p, t_btree *ast) +{ + t_exec *exec; +// t_cmd *cmd; + int op; + int fds[2]; + + exec = &data_singleton()->exec; + op = pop(&exec->op_stack); + if ((EXEC_IS_AND_IF(exec->attrs) + && ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") != 0) + || (EXEC_IS_OR_IF(exec->attrs) + && ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") == 0)) + return (1); + fds[PIPE_WRITE] = STDOUT; + fds[PIPE_READ] = STDIN; + if (op == TK_AMP) + exec->job.attrs |= JOB_BG; + else if (op == TK_PIPE) + pipe(fds); + p->fdin = exec->fdin; + p->to_close = fds[PIPE_READ]; + p->fdout = fds[PIPE_WRITE]; + exec->fdin = fds[PIPE_READ]; + p->redirs = ft_lstmap(((t_astnode *)ast->item)->data.cmd.redir, &redir_copy); + return (set_process_map(p, ast)); +} diff --git a/42sh/src/exec/set_process_case.c b/42sh/src/exec/set_process_case.c new file mode 100644 index 00000000..ac184d08 --- /dev/null +++ b/42sh/src/exec/set_process_case.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_case.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 20:36:04 by wescande #+# #+# */ +/* Updated: 2017/03/08 14:59:25 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int set_process_case(t_process *p, t_btree *ast) +{ + p->data.d_case.list_word = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.wordlist, tab_esc_copy); + p->data.d_case.content = btree_map(ast->right, &node_copy); + p->type = PROCESS_CASE; + return (0); +} diff --git a/42sh/src/exec/set_process_cmd.c b/42sh/src/exec/set_process_cmd.c new file mode 100644 index 00000000..76b4b098 --- /dev/null +++ b/42sh/src/exec/set_process_cmd.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 15:06:05 by wescande #+# #+# */ +/* Updated: 2017/03/08 18:49:55 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int set_process_cmd(t_process *p, t_btree *ast) +{ + t_btree *func; + + if (!(p->data.cmd.av = token_to_argv(((t_astnode *)ast->item)->data.cmd.token, 1))) + return (1); + p->data.cmd.path = NULL; + p->data.cmd.execf = NULL; + p->data.cmd.stat = ft_memalloc(sizeof(struct stat)); + p->type = PROCESS_FILE; + if ((func = is_function(p))) + { + p->data.subshell.content = func; + p->type = PROCESS_FUNCTION; + } + else if ((p->data.cmd.execf = is_builtin(p))) + p->type = PROCESS_BUILTIN; + else if (ft_strchr(p->data.cmd.av[0], '/')) + { + p->data.cmd.execf = &execve; + p->data.cmd.path = ft_strdup(p->data.cmd.av[0]); + if (stat(p->data.cmd.path, p->data.cmd.stat) == -1) + ft_memdel((void**)&p->data.cmd.stat); + } + else if (ft_hash(p)) + { + p->data.cmd.execf = &execve; + if (stat(p->data.cmd.path, p->data.cmd.stat) == -1) + { + ft_memdel((void**)&p->data.cmd.stat); + ft_dprintf(2, "{red}%s: %s: unexpected stat (2) failure\n", SHELL_NAME, p->data.cmd.path); + } + } + return (0); +} diff --git a/42sh/src/exec/set_process_for.c b/42sh/src/exec/set_process_for.c new file mode 100644 index 00000000..e51621ed --- /dev/null +++ b/42sh/src/exec/set_process_for.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_for.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 19:38:05 by wescande #+# #+# */ +/* Updated: 2017/03/08 14:59:08 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int set_process_for(t_process *p, t_btree *ast) +{ + p->data.d_for.list_word = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.wordlist, tab_esc_copy); + p->data.d_for.content = btree_map(ast->right, &node_copy); + p->type = PROCESS_FOR; + return (0); +} diff --git a/42sh/src/main/lib_expansion.c b/42sh/src/exec/set_process_if.c similarity index 58% rename from 42sh/src/main/lib_expansion.c rename to 42sh/src/exec/set_process_if.c index 8905c284..3aaac67c 100644 --- a/42sh/src/main/lib_expansion.c +++ b/42sh/src/exec/set_process_if.c @@ -1,28 +1,21 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* lib_expansion.c :+: :+: :+: */ +/* set_process_if.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ +/* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2016/12/03 13:37:41 by jhalford #+# #+# */ -/* Updated: 2016/12/03 13:37:41 by jhalford ### ########.fr */ +/* Created: 2017/03/07 19:19:50 by wescande #+# #+# */ +/* Updated: 2017/03/08 14:59:17 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -void ft_expand_dollar(char **av, char **env) +int set_process_if(t_process *p, t_btree *ast) { - char *dollar; - - while (*av) - { - if ((dollar = ft_strchr(*av, '$'))) - { - *dollar = '\0'; - *av = ft_strjoin(*av, ft_getenv(env, dollar + 1)); - } - av++; - } + p->data.d_if.condition = btree_map(ast->left, &node_copy); + p->data.d_if.content = btree_map(ast->right, &node_copy); + p->type = PROCESS_IF; + return (0); } diff --git a/42sh/src/exec/set_process_map.c b/42sh/src/exec/set_process_map.c new file mode 100644 index 00000000..cc9fb49a --- /dev/null +++ b/42sh/src/exec/set_process_map.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 15:08:12 by wescande #+# #+# */ +/* Updated: 2017/03/08 14:58:36 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_itof g_setprocessmap[] = +{ + {TK_NEWLINE, NULL}, + {TK_SEMI, NULL}, + {TK_AMP, NULL}, + {TK_AND_IF, NULL}, + {TK_OR_IF,NULL}, + {TK_PIPE, NULL}, + {TK_WHILE, &set_process_while}, + {TK_IF, &set_process_if}, + {TK_ELIF, NULL}, + {TK_ELSE, NULL}, + {TK_UNTIL, &set_process_until}, + {TK_FOR, &set_process_for}, + {TK_CASE, &set_process_case}, + {TK_PAREN_OPEN, NULL}, + {TK_ASSIGNEMENT_WORD, NULL}, + {MATH, NULL}, + {SUBSHELL, &set_process_subshell}, + {CMD, &set_process_cmd}, + {0, NULL} +}; + +int set_process_map(t_process *p, t_btree *ast) +{ + int i; + t_astnode *item; + + i = -1; + if (!ast) + return (0); + item = ast->item; + while (g_setprocessmap[++i].id) + if (item->type == g_setprocessmap[i].id) + { + if (!g_setprocessmap[i].f) + return (1); + return ((*g_setprocessmap[i].f)(p, ast)); + } + return (1); +} diff --git a/42sh/src/exec/set_process_subshell.c b/42sh/src/exec/set_process_subshell.c new file mode 100644 index 00000000..b7cdb55f --- /dev/null +++ b/42sh/src/exec/set_process_subshell.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_sub.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 00:02:01 by wescande #+# #+# */ +/* Updated: 2017/03/08 14:59:55 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int set_process_subshell(t_process *p, t_btree *ast) +{ + p->data.subshell.content = btree_map(ast->right, &node_copy); + p->type = PROCESS_SUBSHELL; + return (0); +} diff --git a/42sh/src/exec/set_process_until.c b/42sh/src/exec/set_process_until.c new file mode 100644 index 00000000..c28b4172 --- /dev/null +++ b/42sh/src/exec/set_process_until.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_until.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 22:22:24 by wescande #+# #+# */ +/* Updated: 2017/03/08 14:59:36 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int set_process_until(t_process *p, t_btree *ast) +{ + p->data.d_while.condition = btree_map(ast->left, &node_copy); + p->data.d_while.content = btree_map(ast->right, &node_copy); + p->type = PROCESS_UNTIL; + return (0); +} diff --git a/42sh/src/exec/set_process_while.c b/42sh/src/exec/set_process_while.c new file mode 100644 index 00000000..56807c2e --- /dev/null +++ b/42sh/src/exec/set_process_while.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_while.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 19:38:10 by wescande #+# #+# */ +/* Updated: 2017/03/08 14:58:54 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int set_process_while(t_process *p, t_btree *ast) +{ + p->data.d_while.condition = btree_map(ast->left, &node_copy); + p->data.d_while.content = btree_map(ast->right, &node_copy); + p->type = PROCESS_WHILE; + return (0); +} diff --git a/42sh/src/exec/token_to_argv.c b/42sh/src/exec/token_to_argv.c new file mode 100644 index 00000000..10b2c192 --- /dev/null +++ b/42sh/src/exec/token_to_argv.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* token_to_argv.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 15:55:53 by wescande #+# #+# */ +/* Updated: 2017/03/07 15:56:25 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char **token_to_argv(t_ld *ld, int do_match) +{ + char **my_tab; + int index; + char **expand; + char **content; + + my_tab = NULL; + while (ld) + { + content = ld->content; + if ((expand = glob(content[0], + (unsigned char *)content[1], + (unsigned char *)content[2], do_match))) + { + index = -1; + while (expand[++index]) + my_tab = ft_sstradd(my_tab, expand[index]); + ft_tabdel(&expand); + } + ld = ld->next; + } + return (my_tab); +} diff --git a/42sh/src/glob/command_getoutput.c b/42sh/src/glob/command_getoutput.c index db94d540..595cca72 100644 --- a/42sh/src/glob/command_getoutput.c +++ b/42sh/src/glob/command_getoutput.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/12 14:01:59 by jhalford #+# #+# */ -/* Updated: 2017/03/03 14:27:40 by wescande ### ########.fr */ +/* Updated: 2017/03/08 23:29:42 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,23 +31,34 @@ static char *manage_output(int *fds) char *command_getoutput(char *command) { - int fds[2]; - t_btree *ast; - t_astnode item; - t_exec *exec; + return (ft_strdup(command)); + /* int fds[2]; */ + /* t_btree *ast; */ + /* t_astnode item; */ + /* char *output; */ + /* char buf[BUF_SIZE + 1]; */ + /* int ret; */ + /* t_exec *exec; */ - exec = &data_singleton()->exec; - item.type = TK_SUBSHELL; - item.data.sstr = malloc(4 * sizeof(char *)); - item.data.sstr[0] = ft_strdup(data_singleton()->argv[0]); - item.data.sstr[1] = ft_strdup("-c"); - item.data.sstr[2] = ft_strdup(command); - item.data.sstr[3] = NULL; - ast = btree_create_node(&item, sizeof(item)); - pipe(fds); - exec->process.fdout = fds[PIPE_WRITE]; - exec_command(&ast); - exec->process.fdout = STDOUT; - close(fds[PIPE_WRITE]); - return (manage_output(fds)); + /* output = NULL; */ + /* exec = &data_singleton()->exec; */ + /* item.type = SUBSHELL; */ + /* item.data.sstr = malloc(4 * sizeof(char *)); */ + /* item.data.sstr[0] = ft_strdup(data_singleton()->argv[0]); */ + /* item.data.sstr[1] = ft_strdup("-c"); */ + /* item.data.sstr[2] = ft_strdup(command); */ + /* item.data.sstr[3] = NULL; */ + /* ast = btree_create_node(&item, sizeof(item)); */ + /* pipe(fds); */ + /* exec->process.fdout = fds[PIPE_WRITE]; */ + /* exec_command(&ast); */ + /* exec->process.fdout = STDOUT; */ + /* close(fds[PIPE_WRITE]); */ + /* while ((ret = read(fds[PIPE_READ], buf, BUF_SIZE))) */ + /* { */ + /* buf[ret] = 0; */ + /* ft_strappend(&output, buf); */ + /* } */ + /* close(fds[PIPE_READ]); */ + /* return (output); */ } diff --git a/42sh/src/glob/dir_glob.c b/42sh/src/glob/dir_glob.c index 8dc2d0da..e83d55b9 100644 --- a/42sh/src/glob/dir_glob.c +++ b/42sh/src/glob/dir_glob.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/30 12:07:16 by wescande #+# #+# */ -/* Updated: 2017/02/07 19:48:12 by wescande ### ########.fr */ +/* Updated: 2017/03/08 14:50:58 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" int is_directory(const char *path) { @@ -49,9 +49,13 @@ int dir_research(t_glob *gl, char *p, { DIR *dir; struct dirent *in; - int ret; - ret = 0; + if (!pat) + { + gl->found = 1; + ft_ld_pushfront(&gl->match, ft_strjoin(p, "/")); + return (0); + } if ((ft_strlen(p) <= 1 || p[ft_strlen(p) - 1] != '.') && is_directory(p)) { dir = opendir(p); @@ -60,5 +64,5 @@ int dir_research(t_glob *gl, char *p, (char *[2]){p, in->d_name}, pat, recursive); closedir(dir); } - return (ret); + return (0); } diff --git a/42sh/src/glob/esc_print.c b/42sh/src/glob/esc_print.c index 8938302d..504e95bd 100644 --- a/42sh/src/glob/esc_print.c +++ b/42sh/src/glob/esc_print.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 15:38:14 by jhalford #+# #+# */ -/* Updated: 2017/02/20 18:49:02 by wescande ### ########.fr */ +/* Updated: 2017/02/24 22:05:04 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void esc_print(char *str, unsigned char *esc) { diff --git a/42sh/src/glob/expand_bquote.c b/42sh/src/glob/expand_bquote.c index d24e3892..d09f7c17 100644 --- a/42sh/src/glob/expand_bquote.c +++ b/42sh/src/glob/expand_bquote.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 17:47:53 by wescande #+# #+# */ -/* Updated: 2017/02/20 19:11:11 by wescande ### ########.fr */ +/* Updated: 2017/02/24 22:04:59 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" static void expand_all_bquote(t_bquote *me, char *content, char *ifs) diff --git a/42sh/src/glob/expand_brace.c b/42sh/src/glob/expand_brace.c index 13cacf4d..c5d48981 100644 --- a/42sh/src/glob/expand_brace.c +++ b/42sh/src/glob/expand_brace.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/12 19:00:29 by wescande #+# #+# */ -/* Updated: 2017/02/20 18:54:19 by wescande ### ########.fr */ +/* Updated: 2017/03/07 20:03:35 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" /* ** expand_brace return expansion of a string. @@ -20,36 +20,6 @@ ** -t_glob *gl -> struct of expanding */ -char **gen_tab(const char *pat, - const unsigned char *esc, - const unsigned char *esc2, - int dup) -{ - char **my_tab; - - if (!(my_tab = (char **)malloc(sizeof(char *) * (esc2 ? 4 : 3)))) - return (NULL); - if (dup) - { - my_tab[0] = ft_strdup(pat); - my_tab[1] = ft_strdup((const char *)esc); - if (esc2) - my_tab[2] = ft_strdup((const char *)esc2); - } - else - { - my_tab[0] = (char *)pat; - my_tab[1] = (char *)esc; - if (esc2) - my_tab[2] = (char *)esc2; - } - if (esc2) - my_tab[3] = NULL; - else - my_tab[2] = NULL; - return (my_tab); -} - static void iter_on_each(t_expand *me) { int i; diff --git a/42sh/src/glob/expand_esc.c b/42sh/src/glob/expand_esc.c index 35777c6f..d5b8104e 100644 --- a/42sh/src/glob/expand_esc.c +++ b/42sh/src/glob/expand_esc.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/31 23:18:56 by wescande #+# #+# */ -/* Updated: 2017/02/20 17:25:43 by wescande ### ########.fr */ +/* Updated: 2017/02/24 22:05:26 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" unsigned char *calc_expand_esc(const unsigned char *esc, int nb_start, int *nb_middle, int *nb_end) diff --git a/42sh/src/glob/expand_home.c b/42sh/src/glob/expand_home.c index f6619624..243d76fe 100644 --- a/42sh/src/glob/expand_home.c +++ b/42sh/src/glob/expand_home.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/03 14:11:46 by wescande #+# #+# */ -/* Updated: 2017/03/03 14:19:22 by wescande ### ########.fr */ +/* Updated: 2017/03/08 23:30:32 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void do_expand_home(t_bquote *me, char *home) { diff --git a/42sh/src/glob/expand_var.c b/42sh/src/glob/expand_var.c index bcf85bc9..1de56e57 100644 --- a/42sh/src/glob/expand_var.c +++ b/42sh/src/glob/expand_var.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 16:09:27 by wescande #+# #+# */ -/* Updated: 2017/02/20 18:56:50 by wescande ### ########.fr */ +/* Updated: 2017/03/07 12:07:53 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" /* ** expand_var return value of $var in the string. @@ -42,7 +42,6 @@ static void insert_var(t_glob *gl, char *pos, char *name, char *content) gl->esc2 = new_esc; ft_strdel(&s1); ft_strdel(&s2); - ft_strdel(&content); } static char *get_name(t_glob *gl, const char *pat) @@ -74,7 +73,8 @@ void expand_var(t_glob *gl) { if (var && *var) { - content = ft_getenv(data_singleton()->env, var); + if (!(content = ft_getenv(data_singleton()->env, var))) + content = ft_getenv(data_singleton()->local_var, var); insert_var(gl, pat, var, content); pat = gl->pat; } diff --git a/42sh/src/glob/ft_strsplit_esc.c b/42sh/src/glob/ft_strsplit_esc.c index f37c7b14..897b4eb3 100644 --- a/42sh/src/glob/ft_strsplit_esc.c +++ b/42sh/src/glob/ft_strsplit_esc.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/31 22:18:46 by wescande #+# #+# */ -/* Updated: 2017/01/31 23:15:17 by wescande ### ########.fr */ +/* Updated: 2017/02/24 22:05:41 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" static int ft_strlen_c(const char *str, const char *fix, const unsigned char *esc, char c) diff --git a/42sh/src/glob/ft_strsplit_spe.c b/42sh/src/glob/ft_strsplit_spe.c index 8c11de67..cc65dcf2 100644 --- a/42sh/src/glob/ft_strsplit_spe.c +++ b/42sh/src/glob/ft_strsplit_spe.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/31 20:49:30 by wescande #+# #+# */ -/* Updated: 2017/02/20 18:57:58 by wescande ### ########.fr */ +/* Updated: 2017/02/24 22:03:22 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" static int ft_strlen_c(const char *str, const char *fix, const unsigned char *esc, char c) diff --git a/42sh/src/glob/gen_tab_esc.c b/42sh/src/glob/gen_tab_esc.c new file mode 100644 index 00000000..39c8e342 --- /dev/null +++ b/42sh/src/glob/gen_tab_esc.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* gen_tab_esc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 20:04:40 by wescande #+# #+# */ +/* Updated: 2017/03/07 21:14:55 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char **gen_tab(const char *pat, + const unsigned char *esc, + const unsigned char *esc2, + int dup) +{ + char **my_tab; + int len; + + if (!(my_tab = (char **)malloc(sizeof(char *) * (esc2 ? 4 : 3)))) + return (NULL); + if (dup) + { + len = ft_strlen(pat); + my_tab[0] = ft_strdup(pat); + my_tab[1] = (char *)dup_char_esc(esc, len >> 3); + if (esc2) + my_tab[2] = (char *)dup_char_esc(esc2, len >> 3); + } + else + { + my_tab[0] = (char *)pat; + my_tab[1] = (char *)esc; + if (esc2) + my_tab[2] = (char *)esc2; + } + if (esc2) + my_tab[3] = NULL; + else + my_tab[2] = NULL; + return (my_tab); +} diff --git a/42sh/src/glob/glob.c b/42sh/src/glob/glob.c index 522c0122..30161c24 100644 --- a/42sh/src/glob/glob.c +++ b/42sh/src/glob/glob.c @@ -6,21 +6,21 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:29:54 by wescande #+# #+# */ -/* Updated: 2017/03/03 16:18:11 by wescande ### ########.fr */ +/* Updated: 2017/03/08 23:31:22 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" /* -** glob return expansion of a string. -** pattern searched are *, ?, [a-z], [!a-z], [^a-z], {ab, ac}, ** -** input parameters are : -** -char *pat -> pattern string to be looking for match -** -char *esc -> escape binary sequence of *pat -** -char **env -> env var. could be NULL -** to just expanse in local directory and not in path dir -*/ + ** glob return expansion of a string. + ** pattern searched are *, ?, [a-z], [!a-z], [^a-z], {ab, ac}, ** + ** input parameters are : + ** -char *pat -> pattern string to be looking for match + ** -char *esc -> escape binary sequence of *pat + ** -char **env -> env var. could be NULL + ** to just expanse in local directory and not in path dir + */ static char **treat_glob(t_glob *gl) { @@ -66,8 +66,7 @@ char **glob(char *pat, unsigned char *esc, else dir_research(&gl, "/", gl.pat + 1, 0); if (!gl.found) - ft_ld_pushfront(&gl.match, - ft_strjoin(gl.cur_dir ? "" : "./", CH(gl.m_pat)[0])); + ft_ld_pushfront(&gl.match, ft_strdup(CH(gl.m_pat)[0])); if (!gl.m_pat->next) break ; gl.m_pat = gl.m_pat->next; diff --git a/42sh/src/glob/is_char_esc.c b/42sh/src/glob/is_char_esc.c index 1a7e8411..0f83bff6 100644 --- a/42sh/src/glob/is_char_esc.c +++ b/42sh/src/glob/is_char_esc.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/27 18:19:55 by wescande #+# #+# */ -/* Updated: 2017/02/20 18:51:47 by wescande ### ########.fr */ +/* Updated: 2017/02/20 20:43:38 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" int is_char_esc(const unsigned char *esc, const char *ini_str, const char *str_pos) diff --git a/42sh/src/glob/lib_perso/ft_ld_back.c b/42sh/src/glob/lib_perso/ft_ld_back.c index d448f449..3b484f36 100644 --- a/42sh/src/glob/lib_perso/ft_ld_back.c +++ b/42sh/src/glob/lib_perso/ft_ld_back.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/16 16:23:26 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:16:53 by wescande ### ########.fr */ +/* Updated: 2017/02/17 23:31:05 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/glob/lib_perso/ft_ld_clear.c b/42sh/src/glob/lib_perso/ft_ld_clear.c index 962d3c11..c36d9695 100644 --- a/42sh/src/glob/lib_perso/ft_ld_clear.c +++ b/42sh/src/glob/lib_perso/ft_ld_clear.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 19:56:49 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:11 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:18:59 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void ft_ld_clear(t_ld **ld, void (*del)()) { diff --git a/42sh/src/glob/lib_perso/ft_ld_copy.c b/42sh/src/glob/lib_perso/ft_ld_copy.c new file mode 100644 index 00000000..86d43dcc --- /dev/null +++ b/42sh/src/glob/lib_perso/ft_ld_copy.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ld_copy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 19:42:23 by wescande #+# #+# */ +/* Updated: 2017/03/08 00:58:50 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_ld *ft_ld_copy(t_ld *src, void *(*f)(void *elem)) +{ + t_ld *dst; + void *content; + + dst = NULL; + while (src) + { + content = (*f)(src->content); + ft_ld_pushfront(&dst, content); + src = src->next; + } + ft_ld_reverse(&dst); + return (dst); +} diff --git a/42sh/src/glob/lib_perso/ft_ld_del.c b/42sh/src/glob/lib_perso/ft_ld_del.c index 69852e67..50667e81 100644 --- a/42sh/src/glob/lib_perso/ft_ld_del.c +++ b/42sh/src/glob/lib_perso/ft_ld_del.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 15:54:53 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:18 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:17:50 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void ft_ld_del(t_ld **ld, void (*del)()) { diff --git a/42sh/src/glob/lib_perso/ft_ld_new.c b/42sh/src/glob/lib_perso/ft_ld_new.c index eece5e18..76000294 100644 --- a/42sh/src/glob/lib_perso/ft_ld_new.c +++ b/42sh/src/glob/lib_perso/ft_ld_new.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 18:17:34 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:34 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:17:20 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void ft_ld_new(t_ld **alst, void *content) { diff --git a/42sh/src/glob/lib_perso/ft_ld_order.c b/42sh/src/glob/lib_perso/ft_ld_order.c index 6f6b2a9c..2adbeba7 100644 --- a/42sh/src/glob/lib_perso/ft_ld_order.c +++ b/42sh/src/glob/lib_perso/ft_ld_order.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/24 19:20:45 by wescande #+# #+# */ -/* Updated: 2017/01/24 19:40:54 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:19:13 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" t_ld *ft_ld_order(t_ld *ld, int (*f)(), void (*del)()) { diff --git a/42sh/src/glob/lib_perso/ft_ld_pushback.c b/42sh/src/glob/lib_perso/ft_ld_pushback.c index 25a1d019..e1dd629c 100644 --- a/42sh/src/glob/lib_perso/ft_ld_pushback.c +++ b/42sh/src/glob/lib_perso/ft_ld_pushback.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/16 15:59:38 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:40 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:17:28 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void ft_ld_pushback(t_ld **alst, void *content) { diff --git a/42sh/src/glob/lib_perso/ft_ld_pushfront.c b/42sh/src/glob/lib_perso/ft_ld_pushfront.c index 5f830ee1..067db748 100644 --- a/42sh/src/glob/lib_perso/ft_ld_pushfront.c +++ b/42sh/src/glob/lib_perso/ft_ld_pushfront.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 18:32:40 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:46 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:15:42 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void ft_ld_pushfront(t_ld **alst, void *content) { diff --git a/42sh/src/glob/lib_perso/ft_ld_reverse.c b/42sh/src/glob/lib_perso/ft_ld_reverse.c index 62ffe670..7dc87189 100644 --- a/42sh/src/glob/lib_perso/ft_ld_reverse.c +++ b/42sh/src/glob/lib_perso/ft_ld_reverse.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 14:16:04 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:53 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:20:35 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void ft_ld_reverse(t_ld **lst) { diff --git a/42sh/src/glob/lib_perso/ft_ld_size.c b/42sh/src/glob/lib_perso/ft_ld_size.c index aab41b06..ae12022d 100644 --- a/42sh/src/glob/lib_perso/ft_ld_size.c +++ b/42sh/src/glob/lib_perso/ft_ld_size.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 18:33:48 by wescande #+# #+# */ -/* Updated: 2017/01/05 14:17:59 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:19:26 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" size_t ft_ld_size(t_ld *ld) { diff --git a/42sh/src/glob/lib_perso/ft_ld_to_tab.c b/42sh/src/glob/lib_perso/ft_ld_to_tab.c index e6db262d..286e3b3f 100644 --- a/42sh/src/glob/lib_perso/ft_ld_to_tab.c +++ b/42sh/src/glob/lib_perso/ft_ld_to_tab.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/05 16:17:00 by wescande #+# #+# */ -/* Updated: 2017/01/05 16:22:12 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:20:05 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" char **ft_ld_to_tab(t_ld *ld) { diff --git a/42sh/src/glob/lib_perso/ft_memrealloc.c b/42sh/src/glob/lib_perso/ft_memrealloc.c index 2ea59d78..50cbeb11 100644 --- a/42sh/src/glob/lib_perso/ft_memrealloc.c +++ b/42sh/src/glob/lib_perso/ft_memrealloc.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/05 13:44:36 by wescande #+# #+# */ -/* Updated: 2017/02/09 17:01:01 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:19:39 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void *ft_memrealloc(void *ptr, size_t old_s, size_t new_s) { diff --git a/42sh/src/glob/lib_perso/ft_strjoinf.c b/42sh/src/glob/lib_perso/ft_strjoinf.c index 3bc72d56..d860b34c 100644 --- a/42sh/src/glob/lib_perso/ft_strjoinf.c +++ b/42sh/src/glob/lib_perso/ft_strjoinf.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/05 13:33:24 by wescande #+# #+# */ -/* Updated: 2017/01/24 16:53:13 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:19:55 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" char *ft_strjoinf(char *s1, char *s2, int state) { diff --git a/42sh/src/glob/lib_perso/ft_strsubf.c b/42sh/src/glob/lib_perso/ft_strsubf.c index 2e6d5b51..72bcb016 100644 --- a/42sh/src/glob/lib_perso/ft_strsubf.c +++ b/42sh/src/glob/lib_perso/ft_strsubf.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/15 17:20:08 by wescande #+# #+# */ -/* Updated: 2017/02/07 13:01:55 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:20:19 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" char *ft_strsubf(char *s, unsigned int start, size_t len, short int mode) { diff --git a/42sh/src/glob/lib_perso/ft_tabdel.c b/42sh/src/glob/lib_perso/ft_tabdel.c index d4f9cff0..680c7b83 100644 --- a/42sh/src/glob/lib_perso/ft_tabdel.c +++ b/42sh/src/glob/lib_perso/ft_tabdel.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/04 16:29:54 by wescande #+# #+# */ -/* Updated: 2017/02/02 14:22:46 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 21:18:08 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" void ft_tabdel(char ***mytab) { diff --git a/42sh/src/glob/lib_perso/ft_tablen.c b/42sh/src/glob/lib_perso/ft_tablen.c index 3efbee0b..149cd7ca 100644 --- a/42sh/src/glob/lib_perso/ft_tablen.c +++ b/42sh/src/glob/lib_perso/ft_tablen.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/28 16:54:07 by wescande #+# #+# */ -/* Updated: 2016/12/28 16:55:46 by wescande ### ########.fr */ +/* Updated: 2017/03/07 21:18:23 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" +#include "minishell.h" int ft_tablen(char **mytab) { diff --git a/42sh/src/glob/match_pattern.c b/42sh/src/glob/match_pattern.c index 536cb08c..57323c48 100644 --- a/42sh/src/glob/match_pattern.c +++ b/42sh/src/glob/match_pattern.c @@ -6,11 +6,11 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/24 17:30:23 by wescande #+# #+# */ -/* Updated: 2017/02/20 14:00:41 by wescande ### ########.fr */ +/* Updated: 2017/03/08 14:35:43 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "glob.h" +#include "minishell.h" static int match_bracket_char(char **cmp, const char *pat, char c, int neg) { @@ -90,6 +90,7 @@ static char *manage_pat(t_glob *gl, char *pat, char *str) if (pat[0] == '.' && pat[1] == '/' && ((str[0] == '.' && str[1] != '/') || str[0] != '.')) { + DG("%s vs %s", pat, str); gl->cur_dir = 0; return (pat + 2); } diff --git a/42sh/src/glob/tab_esc_copy.c b/42sh/src/glob/tab_esc_copy.c new file mode 100644 index 00000000..0661d863 --- /dev/null +++ b/42sh/src/glob/tab_esc_copy.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* set_process_for.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 19:38:05 by wescande #+# #+# */ +/* Updated: 2017/03/07 20:40:30 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "glob.h" + +void *tab_esc_copy(void *content) +{ + char **ch_cont; + + ch_cont = (char **)content; + return (gen_tab(ch_cont[0], (unsigned char *)ch_cont[1], (unsigned char *)ch_cont[2], 1)); +} diff --git a/42sh/src/glob/word_is_assignment.c b/42sh/src/glob/word_is_assignment.c new file mode 100644 index 00000000..d0908d23 --- /dev/null +++ b/42sh/src/glob/word_is_assignment.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* word_is_assignment.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/07 18:59:11 by wescande #+# #+# */ +/* Updated: 2017/03/07 21:20:53 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int word_is_assignment(char **content) +{ + const int len = ft_strlen(content[0]); + int pos; + char c; + const unsigned char *esc = (const unsigned char *)content[1]; + + pos = -1; + if (ft_isdigit(content[0][0])) + return (0); + while (++pos < len) + { + if (is_char_esc(esc, content[0], content[0] + pos)) + return (0); + c = content[0][pos]; + if (!ft_isalnum(c) && c != '_') + return (0); + } + return (1); +} + diff --git a/42sh/src/hash_table/ft_add_hash.c b/42sh/src/hash_table/ft_add_hash.c index ba18cc91..5e2d95d3 100644 --- a/42sh/src/hash_table/ft_add_hash.c +++ b/42sh/src/hash_table/ft_add_hash.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:20:11 by gwojda #+# #+# */ -/* Updated: 2017/02/18 14:38:21 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 16:56:04 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,11 +18,11 @@ int ft_add_hash(t_process *p) t_hash hash; if (!(hash.path = ft_findexec( - ft_getenv(data_singleton()->env, "PATH"), p->av[0]))) + ft_getenv(data_singleton()->env, "PATH"), p->data.cmd.av[0]))) return (0); - hash.key = ft_strdup(p->av[0]); - id = ft_hash_str(p->av[0]); + hash.key = ft_strdup(p->data.cmd.av[0]); + id = ft_hash_str(p->data.cmd.av[0]); ft_lsteadd(&(g_hash[id]), ft_lstnew(&hash, sizeof(t_hash))); - p->path = ft_strdup(hash.path); + p->data.cmd.path = ft_strdup(hash.path); return (1); } diff --git a/42sh/src/hash_table/hash.c b/42sh/src/hash_table/hash.c index fa3604fd..2276a4e1 100644 --- a/42sh/src/hash_table/hash.c +++ b/42sh/src/hash_table/hash.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:06:19 by gwojda #+# #+# */ -/* Updated: 2017/02/18 14:16:35 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 16:02:41 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/hash_table/hash_str.c b/42sh/src/hash_table/hash_str.c index f7e70f11..6755896a 100644 --- a/42sh/src/hash_table/hash_str.c +++ b/42sh/src/hash_table/hash_str.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:32:18 by gwojda #+# #+# */ -/* Updated: 2017/02/19 12:58:47 by gwojda ### ########.fr */ +/* Updated: 2017/03/04 18:51:14 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/hash_table/is_hash.c b/42sh/src/hash_table/is_hash.c index 03fdf717..385401e3 100644 --- a/42sh/src/hash_table/is_hash.c +++ b/42sh/src/hash_table/is_hash.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:08:40 by gwojda #+# #+# */ -/* Updated: 2017/02/18 16:42:12 by gwojda ### ########.fr */ +/* Updated: 2017/03/07 14:45:20 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,12 +18,12 @@ int ft_is_hash(t_process *p) t_list *ref; int id; - id = ft_hash_str(p->av[0]); + id = ft_hash_str(p->data.cmd.av[0]); list = g_hash[id]; ref = list; while (list) { - if (!ft_strcmp(((t_hash *)list->content)->key, p->av[0])) + if (!ft_strcmp(((t_hash *)list->content)->key, p->data.cmd.av[0])) { if (access(((t_hash *)list->content)->path, X_OK)) { @@ -31,7 +31,7 @@ int ft_is_hash(t_process *p) ft_lstdelone(&list, &ft_hash_free); return (0); } - p->path = ft_strdup(((t_hash *)list->content)->path); + p->data.cmd.path = ft_strdup(((t_hash *)list->content)->path); return (1); } ref = list; diff --git a/42sh/src/job-control/builtin_bg.c b/42sh/src/job-control/builtin_bg.c index d3f91c1f..99eb37fc 100644 --- a/42sh/src/job-control/builtin_bg.c +++ b/42sh/src/job-control/builtin_bg.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/09 16:54:18 by jhalford #+# #+# */ -/* Updated: 2017/01/11 14:37:23 by jhalford ### ########.fr */ +/* Updated: 2017/01/20 00:09:28 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int builtin_bg(const char *path, char *const av[], char *const envp[]) { diff --git a/42sh/src/job-control/builtin_fg.c b/42sh/src/job-control/builtin_fg.c index 373ba8a9..9e7720f6 100644 --- a/42sh/src/job-control/builtin_fg.c +++ b/42sh/src/job-control/builtin_fg.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/08 14:30:07 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:05:31 by jhalford ### ########.fr */ +/* Updated: 2017/02/21 20:09:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int builtin_fg(const char *path, char *const av[], char *const envp[]) { diff --git a/42sh/src/job-control/builtin_jobs.c b/42sh/src/job-control/builtin_jobs.c index f2a83ee0..3031cde0 100644 --- a/42sh/src/job-control/builtin_jobs.c +++ b/42sh/src/job-control/builtin_jobs.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 17:43:01 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:05:34 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 18:52:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" static int bt_jobs_parse(char **av, int *i) { diff --git a/42sh/src/job-control/do_job_notification.c b/42sh/src/job-control/do_job_notification.c index 74eff978..7d73c78a 100644 --- a/42sh/src/job-control/do_job_notification.c +++ b/42sh/src/job-control/do_job_notification.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 13:01:19 by jhalford #+# #+# */ -/* Updated: 2017/02/03 15:47:44 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:35:18 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int do_job_notification(void) { @@ -27,14 +27,14 @@ int do_job_notification(void) { j = jlist->content; if (job_is_completed(j->id) - || (job_is_stopped(j->id) && !(j->attributes & JOB_NOTIFIED))) + || (job_is_stopped(j->id) && !(j->attrs & JOB_NOTIFIED))) { ret = 1; job_notify_change(j->id); if (job_is_completed(j->id)) job_remove(j->id); else - j->attributes |= JOB_NOTIFIED; + j->attrs |= JOB_NOTIFIED; } jlist = jlist->next; } diff --git a/42sh/src/job-control/job_addprocess.c b/42sh/src/job-control/job_addprocess.c index 171df690..af8e039d 100644 --- a/42sh/src/job-control/job_addprocess.c +++ b/42sh/src/job-control/job_addprocess.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:54:51 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:07:16 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:16:09 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int job_addprocess(t_process *p) { @@ -19,7 +19,8 @@ int job_addprocess(t_process *p) jobc = &data_singleton()->jobc; job = &data_singleton()->exec.job; - if (IS_PIPESTART(p->attributes)) + DG("adding pid=[%i] to job", p->pid); + if (IS_PIPESTART(*p)) { job_update_id(); job->id = jobc->current_id; @@ -27,11 +28,8 @@ int job_addprocess(t_process *p) ft_lstadd(&jobc->first_job, ft_lstnew(job, sizeof(*job))); } job = jobc->first_job->content; - if (p->pid > 0) - { - ft_lsteadd(&job->first_process, ft_lstnew(p, sizeof(*p))); - } - if (JOB_IS_BG(job->attributes) && IS_PIPEEND(p->attributes)) + ft_lsteadd(&job->first_process, ft_lstnew(p, sizeof(*p))); + if (JOB_IS_BG(job->attrs) && IS_PIPEEND(*p)) job_notify_new(job); return (0); } diff --git a/42sh/src/job-control/job_format.c b/42sh/src/job-control/job_format.c index 5c811a86..dde4e0fb 100644 --- a/42sh/src/job-control/job_format.c +++ b/42sh/src/job-control/job_format.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_format(t_job *j, int opts) { diff --git a/42sh/src/job-control/job_format_head.c b/42sh/src/job-control/job_format_head.c index c7b8854f..f874933e 100644 --- a/42sh/src/job-control/job_format_head.c +++ b/42sh/src/job-control/job_format_head.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_format_head(t_job *j) { diff --git a/42sh/src/job-control/job_free.c b/42sh/src/job-control/job_free.c index db63e7f2..7046cfe7 100644 --- a/42sh/src/job-control/job_free.c +++ b/42sh/src/job-control/job_free.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_free(void *content, size_t content_size) { diff --git a/42sh/src/job-control/job_getprocess.c b/42sh/src/job-control/job_getprocess.c index a5d421c3..17eec5d2 100644 --- a/42sh/src/job-control/job_getprocess.c +++ b/42sh/src/job-control/job_getprocess.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/31 15:07:30 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:07:41 by jhalford ### ########.fr */ +/* Updated: 2017/03/03 19:42:19 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" t_list *job_getprocess(pid_t pid) { diff --git a/42sh/src/job-control/job_getrank.c b/42sh/src/job-control/job_getrank.c index f07263e0..6da80d6b 100644 --- a/42sh/src/job-control/job_getrank.c +++ b/42sh/src/job-control/job_getrank.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_getrank(int (*rank)[2]) { diff --git a/42sh/src/job-control/job_is_completed.c b/42sh/src/job-control/job_is_completed.c index 8c9a0f1c..c289614f 100644 --- a/42sh/src/job-control/job_is_completed.c +++ b/42sh/src/job-control/job_is_completed.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 15:10:20 by jhalford #+# #+# */ -/* Updated: 2017/01/31 13:52:36 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:30:22 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int job_is_completed(int id) { @@ -25,7 +25,7 @@ int job_is_completed(int id) while (lst) { p = lst->content; - if (!(p->attributes & PROCESS_COMPLETED)) + if (!(p->attrs & PROCESS_COMPLETED)) return (0); lst = lst->next; } diff --git a/42sh/src/job-control/job_is_stopped.c b/42sh/src/job-control/job_is_stopped.c index e6b2c80a..16c2bee8 100644 --- a/42sh/src/job-control/job_is_stopped.c +++ b/42sh/src/job-control/job_is_stopped.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 15:06:45 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:54:33 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:53:25 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int job_is_stopped(int id) { @@ -25,7 +25,7 @@ int job_is_stopped(int id) while (lst) { p = lst->content; - if (!(p->attributes & (PROCESS_COMPLETED | PROCESS_SUSPENDED))) + if (!(p->attrs & (PROCESS_COMPLETED | PROCESS_SUSPENDED))) return (0); lst = lst->next; } diff --git a/42sh/src/job-control/job_kill_all.c b/42sh/src/job-control/job_kill_all.c index 1d36a8a6..ded01abd 100644 --- a/42sh/src/job-control/job_kill_all.c +++ b/42sh/src/job-control/job_kill_all.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_kill_all(void) { diff --git a/42sh/src/job-control/job_notify_change.c b/42sh/src/job-control/job_notify_change.c index fd6c7728..9535b95a 100644 --- a/42sh/src/job-control/job_notify_change.c +++ b/42sh/src/job-control/job_notify_change.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 15:04:03 by jhalford #+# #+# */ -/* Updated: 2017/01/31 14:46:48 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 17:18:20 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_notify_change(int id) { diff --git a/42sh/src/job-control/job_notify_new.c b/42sh/src/job-control/job_notify_new.c index 1b39f0ea..79e35da1 100644 --- a/42sh/src/job-control/job_notify_new.c +++ b/42sh/src/job-control/job_notify_new.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:27:01 by jhalford #+# #+# */ -/* Updated: 2016/12/15 17:15:54 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 18:28:01 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_notify_new(t_job *job) { diff --git a/42sh/src/job-control/job_remove.c b/42sh/src/job-control/job_remove.c index 9c94db11..b1e88928 100644 --- a/42sh/src/job-control/job_remove.c +++ b/42sh/src/job-control/job_remove.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 12:51:08 by jhalford #+# #+# */ -/* Updated: 2017/01/31 13:44:26 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 18:18:34 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_remove(int id) { diff --git a/42sh/src/job-control/job_run.c b/42sh/src/job-control/job_run.c index bd9d0f48..412af6df 100644 --- a/42sh/src/job-control/job_run.c +++ b/42sh/src/job-control/job_run.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_run(t_job *job, int foreground) { diff --git a/42sh/src/job-control/job_update_id.c b/42sh/src/job-control/job_update_id.c index 08ac73d2..8b423e52 100644 --- a/42sh/src/job-control/job_update_id.c +++ b/42sh/src/job-control/job_update_id.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 13:33:08 by jhalford #+# #+# */ -/* Updated: 2017/01/10 13:22:11 by jhalford ### ########.fr */ +/* Updated: 2017/03/03 18:18:29 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/job_update_status.c b/42sh/src/job-control/job_update_status.c index 1fa30cd5..1cae0944 100644 --- a/42sh/src/job-control/job_update_status.c +++ b/42sh/src/job-control/job_update_status.c @@ -6,18 +6,21 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 12:56:11 by jhalford #+# #+# */ -/* Updated: 2017/02/03 15:50:30 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:35:12 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void job_update_status(void) { int status; pid_t pid; - pid = waitpid(WAIT_ANY, &status, WUNTRACED | WNOHANG); - while (!process_mark_status(pid, status)) + do + { pid = waitpid(WAIT_ANY, &status, WUNTRACED | WNOHANG); + DG("pid=[%d]", pid); + } + while (!mark_process_status(pid, status)); } diff --git a/42sh/src/job-control/job_wait.c b/42sh/src/job-control/job_wait.c index 62f5ebef..8b991d00 100644 --- a/42sh/src/job-control/job_wait.c +++ b/42sh/src/job-control/job_wait.c @@ -6,26 +6,26 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 11:49:05 by jhalford #+# #+# */ -/* Updated: 2017/01/31 13:44:17 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:46:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int job_wait(int id) { pid_t pid; + t_job *j; + t_jobc *jobc; int status; - if (job_is_stopped(id)) - return (0); - job_update_status(); - pid = waitpid(WAIT_ANY, &status, WUNTRACED); - while (!process_mark_status(pid, status) - && !job_is_completed(id) - && !job_is_stopped(id)) - { - pid = waitpid(WAIT_ANY, &status, WUNTRACED); - } + DG("job wait [%i]", id); + jobc = &data_singleton()->jobc; + j = ft_lst_find(jobc->first_job, &id, job_cmp_id)->content; + do + pid = waitpid(-j->pgid, &status, WUNTRACED); + while (!mark_process_status(pid, status) + && !job_is_stopped(id) + && !job_is_completed(id)); return (0); } diff --git a/42sh/src/job-control/mark_job_as_running.c b/42sh/src/job-control/mark_job_as_running.c index ea82a0e7..ae34335f 100644 --- a/42sh/src/job-control/mark_job_as_running.c +++ b/42sh/src/job-control/mark_job_as_running.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/08 14:40:40 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:08:11 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 12:30:50 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" void mark_job_as_running(t_job *j) { @@ -21,12 +21,12 @@ void mark_job_as_running(t_job *j) while (plist) { p = plist->content; - if (p->attributes & PROCESS_SUSPENDED) + if (p->attrs & PROCESS_SUSPENDED) { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_CONTINUED; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_CONTINUED; } plist = plist->next; } - j->attributes &= ~JOB_NOTIFIED; + j->attrs &= ~JOB_NOTIFIED; } diff --git a/42sh/src/job-control/process_format.c b/42sh/src/job-control/process_format.c index 25fe10cb..c8a36422 100644 --- a/42sh/src/job-control/process_format.c +++ b/42sh/src/job-control/process_format.c @@ -6,17 +6,17 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/09 13:05:55 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:10:56 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:08:26 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" static void process_format_state(t_process *p) { int state; - state = p->attributes & PROCESS_STATE_MASK; + state = p->attrs & PROCESS_STATE_MASK; if (state == PROCESS_RUNNING) ft_putstr("running "); else if (state == PROCESS_SUSPENDED) @@ -24,8 +24,8 @@ static void process_format_state(t_process *p) else if (state == PROCESS_CONTINUED) { ft_putstr("continued"); - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes |= PROCESS_RUNNING; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs |= PROCESS_RUNNING; } else if (state == PROCESS_COMPLETED) { @@ -42,14 +42,7 @@ static void process_format_com_long(t_list **plist) t_process *p; p = (*plist)->content; - if (p->attributes & PROCESS_SUBSHELL) - { - ft_putstr("( "); - ft_putstr(p->av[2]); - ft_putstr(" )"); - } - else - ft_sstrprint(p->av, ' '); + process_print(p); if ((*plist)->next) ft_putstr(" |"); (*plist) = (*plist)->next; @@ -62,22 +55,15 @@ static void process_format_com_short(t_list **plist, t_flag state) while (*plist) { p = (*plist)->content; - if (!(p->attributes & state) || + if (!(p->attrs & state) || (state == PROCESS_COMPLETED && p->status != 0)) break ; - if (p->attributes & PROCESS_CONTINUED) + if (p->attrs & PROCESS_CONTINUED) { - p->attributes &= ~PROCESS_STATE_MASK; - p->attributes &= ~PROCESS_RUNNING; + p->attrs &= ~PROCESS_STATE_MASK; + p->attrs &= ~PROCESS_RUNNING; } - if (p->attributes & PROCESS_SUBSHELL) - { - ft_putstr("( "); - ft_putstr(p->av[2]); - ft_putstr(" )"); - } - else - ft_sstrprint(p->av, ' '); + process_print(p); if ((*plist)->next) ft_putstr(" | "); (*plist) = (*plist)->next; @@ -90,7 +76,7 @@ void process_format(t_list **plist, int firstp, int opts) t_flag state; p = (*plist)->content; - state = p->attributes & PROCESS_STATE_MASK; + state = p->attrs & PROCESS_STATE_MASK; if (!firstp) ft_printf(" "); if (opts & JOBS_OPTS_L) diff --git a/42sh/src/job-control/process_free.c b/42sh/src/job-control/process_free.c index ce23bf71..40a156b4 100644 --- a/42sh/src/job-control/process_free.c +++ b/42sh/src/job-control/process_free.c @@ -6,20 +6,35 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 12:41:11 by jhalford #+# #+# */ -/* Updated: 2017/02/03 13:59:25 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:13:57 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" + +t_itof g_freemap[] = +{ + {PROCESS_FUNCTION, process_free_subshell}, + {PROCESS_BUILTIN, process_free_cmd}, + {PROCESS_FILE, process_free_cmd}, + {PROCESS_SUBSHELL, process_free_subshell}, + {PROCESS_WHILE, process_free_cond}, + {PROCESS_UNTIL, process_free_cond}, + {PROCESS_IF, process_free_cond}, + {PROCESS_FOR, process_free_list}, + {PROCESS_CASE, process_free_list}, +}; void process_free(void *content, size_t content_size) { t_process *p; - (void)content_size; p = content; - ft_strdel(&p->path); - ft_sstrfree(p->av); - ft_lstdel(&p->redirs, ft_lst_cfree); + (void)content_size; + if (p->type >= PROCESS_MAX) + return ; + if (g_freemap[p->type].f) + (g_freemap[p->type].f)(p); + ft_lstdel(&p->redirs, redir_free); free(p); } diff --git a/42sh/src/job-control/process_free_cmd.c b/42sh/src/job-control/process_free_cmd.c new file mode 100644 index 00000000..ab2e446c --- /dev/null +++ b/42sh/src/job-control/process_free_cmd.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_free_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 00:58:02 by wescande #+# #+# */ +/* Updated: 2017/03/08 15:04:45 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_free_cmd(t_process *p) +{ + ft_strdel(&p->data.cmd.path); + ft_sstrfree(p->data.cmd.av); + p->data.cmd.execf = NULL; + ft_memdel((void**)&p->data.cmd.stat); + return (0); +} diff --git a/42sh/src/job-control/process_free_cond.c b/42sh/src/job-control/process_free_cond.c new file mode 100644 index 00000000..69624104 --- /dev/null +++ b/42sh/src/job-control/process_free_cond.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_free_cond.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 02:26:31 by wescande #+# #+# */ +/* Updated: 2017/03/08 02:39:12 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_free_cond(t_process *p) +{ + btree_del(&p->data.d_while.condition, &ast_free); + btree_del(&p->data.d_while.content, &ast_free); + return (0); +} diff --git a/42sh/src/job-control/process_free_list.c b/42sh/src/job-control/process_free_list.c new file mode 100644 index 00000000..d0b05f69 --- /dev/null +++ b/42sh/src/job-control/process_free_list.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_free_list.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 02:37:04 by wescande #+# #+# */ +/* Updated: 2017/03/08 02:37:52 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_free_list(t_process *p) +{ + ft_ld_del(&p->data.d_for.list_word, &ft_tabdel); + btree_del(&p->data.d_for.content, &ast_free); + return (0); +} diff --git a/42sh/src/job-control/process_free_subshell.c b/42sh/src/job-control/process_free_subshell.c new file mode 100644 index 00000000..9bfded99 --- /dev/null +++ b/42sh/src/job-control/process_free_subshell.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_free_subshell.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 02:38:12 by wescande #+# #+# */ +/* Updated: 2017/03/08 23:31:53 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_free_subshell(t_process *p) +{ + btree_del(&p->data.subshell.content, &ast_free); + return (0); +} diff --git a/42sh/src/job-control/process_print.c b/42sh/src/job-control/process_print.c new file mode 100644 index 00000000..af0313dc --- /dev/null +++ b/42sh/src/job-control/process_print.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:03:32 by wescande #+# #+# */ +/* Updated: 2017/03/08 20:44:26 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_itof g_printmap[] = +{ + {PROCESS_FUNCTION, process_print_function}, + {PROCESS_BUILTIN, process_print_cmd}, + {PROCESS_FILE, process_print_cmd}, + {PROCESS_SUBSHELL, process_print_subshell}, + {PROCESS_WHILE, process_print_while}, + {PROCESS_UNTIL, process_print_until}, + {PROCESS_IF, process_print_if}, + {PROCESS_FOR, process_print_for}, + {PROCESS_CASE, process_print_case}, +}; + +void process_print(t_process *p) +{ + if (p->type >= PROCESS_MAX) + return ; + if (g_printmap[p->type].f) + (*g_printmap[p->type].f)(p); +} diff --git a/42sh/src/job-control/process_print_case.c b/42sh/src/job-control/process_print_case.c new file mode 100644 index 00000000..165045fb --- /dev/null +++ b/42sh/src/job-control/process_print_case.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_case.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:15:22 by wescande #+# #+# */ +/* Updated: 2017/03/08 19:13:50 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_case(t_process *p) +{ + (void)p; + ft_putstr("CASE GROUP"); + return (0); +} diff --git a/42sh/src/job-control/process_print_cmd.c b/42sh/src/job-control/process_print_cmd.c new file mode 100644 index 00000000..8ae2307b --- /dev/null +++ b/42sh/src/job-control/process_print_cmd.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:17:16 by wescande #+# #+# */ +/* Updated: 2017/03/08 20:28:10 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_cmd(t_process *p) +{ + ft_sstrprint(p->data.cmd.av, ' '); + return (0); +} diff --git a/42sh/src/job-control/process_print_for.c b/42sh/src/job-control/process_print_for.c new file mode 100644 index 00000000..0d622e01 --- /dev/null +++ b/42sh/src/job-control/process_print_for.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_for.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:14:21 by wescande #+# #+# */ +/* Updated: 2017/03/08 19:13:16 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_for(t_process *p) +{ + (void)p; + ft_putstr("FOR GROUP"); + return (0); +} diff --git a/42sh/src/job-control/process_print_function.c b/42sh/src/job-control/process_print_function.c new file mode 100644 index 00000000..e0f0f91f --- /dev/null +++ b/42sh/src/job-control/process_print_function.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:12:18 by wescande #+# #+# */ +/* Updated: 2017/03/08 19:13:54 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_function(t_process *p) +{ + (void)p; + ft_putstr("FUNCTION GROUP"); + return (0); +} diff --git a/42sh/src/job-control/process_print_if.c b/42sh/src/job-control/process_print_if.c new file mode 100644 index 00000000..a64d3276 --- /dev/null +++ b/42sh/src/job-control/process_print_if.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_if.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:14:48 by wescande #+# #+# */ +/* Updated: 2017/03/08 19:14:01 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_if(t_process *p) +{ + (void)p; + ft_putstr("IF GROUP"); + return (0); +} diff --git a/42sh/src/job-control/process_print_subshell.c b/42sh/src/job-control/process_print_subshell.c new file mode 100644 index 00000000..647db0b5 --- /dev/null +++ b/42sh/src/job-control/process_print_subshell.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_subshell.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:06:06 by wescande #+# #+# */ +/* Updated: 2017/03/08 19:14:54 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_subshell(t_process *p) +{ + (void)p; + ft_putstr("SUBSHELL GROUP"); + return (0); +} diff --git a/42sh/src/job-control/process_print_until.c b/42sh/src/job-control/process_print_until.c new file mode 100644 index 00000000..2732e796 --- /dev/null +++ b/42sh/src/job-control/process_print_until.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_until.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:16:00 by wescande #+# #+# */ +/* Updated: 2017/03/08 19:13:36 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_until(t_process *p) +{ + (void)p; + ft_putstr("UNTIL GROUP"); + return (0); +} diff --git a/42sh/src/job-control/process_print_while.c b/42sh/src/job-control/process_print_while.c new file mode 100644 index 00000000..9c4a67f3 --- /dev/null +++ b/42sh/src/job-control/process_print_while.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* process_print_while.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: wescande +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:15:01 by wescande #+# #+# */ +/* Updated: 2017/03/08 19:14:13 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_print_while(t_process *p) +{ + (void)p; + ft_putstr("WHILE GROUP"); + return (0); +} diff --git a/42sh/src/job-control/put_job_in_background.c b/42sh/src/job-control/put_job_in_background.c index 02357157..b72e7e98 100644 --- a/42sh/src/job-control/put_job_in_background.c +++ b/42sh/src/job-control/put_job_in_background.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 15:03:29 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:09:06 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:33:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int put_job_in_background(t_job *j, int cont) { diff --git a/42sh/src/job-control/put_job_in_foreground.c b/42sh/src/job-control/put_job_in_foreground.c index 187ca02f..9e5ae442 100644 --- a/42sh/src/job-control/put_job_in_foreground.c +++ b/42sh/src/job-control/put_job_in_foreground.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:58:36 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:10:45 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 20:33:21 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "job_control.h" +#include "minishell.h" int put_job_in_foreground(t_job *j, int cont) { @@ -18,8 +18,6 @@ int put_job_in_foreground(t_job *j, int cont) jobc = &data_singleton()->jobc; tcsetpgrp(STDIN, j->pgid); - tcsetattr(STDIN, TCSADRAIN, &jobc->shell_tmodes); - if (cont) { tcsetattr(STDIN, TCSADRAIN, &j->tmodes); @@ -28,10 +26,11 @@ int put_job_in_foreground(t_job *j, int cont) } job_wait(j->id); job_remove(j->id); - tcsetpgrp(STDIN, jobc->shell_pgid); - - tcgetattr(STDIN, &j->tmodes); - tcsetattr(STDIN, TCSADRAIN, &jobc->shell_tmodes); + if (SH_HAS_JOBC(data_singleton()->opts)) + { + tcgetattr(STDIN, &j->tmodes); + tcsetattr(STDIN, TCSADRAIN, &jobc->shell_tmodes); + } return (0); } diff --git a/42sh/src/job-control/sigchld_handler.c b/42sh/src/job-control/sigchld_handler.c index 87f795c7..22d4c8a6 100644 --- a/42sh/src/job-control/sigchld_handler.c +++ b/42sh/src/job-control/sigchld_handler.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 17:37:56 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:09:29 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 17:21:34 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,5 @@ void sigchld_handler(int signo) { - t_data *data; - (void)signo; - data = data_singleton(); } diff --git a/42sh/src/job-control/sigint_handler.c b/42sh/src/job-control/sigint_handler.c index 9ca6a1b3..85c66843 100644 --- a/42sh/src/job-control/sigint_handler.c +++ b/42sh/src/job-control/sigint_handler.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 15:14:47 by jhalford #+# #+# */ -/* Updated: 2017/01/10 17:24:06 by jhalford ### ########.fr */ +/* Updated: 2017/01/22 20:56:45 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/sigtstp_handler.c b/42sh/src/job-control/sigtstp_handler.c index 3ef1c541..5244b9c0 100644 --- a/42sh/src/job-control/sigtstp_handler.c +++ b/42sh/src/job-control/sigtstp_handler.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 15:14:53 by jhalford #+# #+# */ -/* Updated: 2017/01/11 14:51:27 by jhalford ### ########.fr */ +/* Updated: 2017/03/05 15:30:58 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,10 +14,10 @@ void sigtstp_handler(int signo) { - t_jobc *jobc; +// t_jobc *jobc; (void)signo; - jobc = &data_singleton()->jobc; +// jobc = &data_singleton()->jobc; DG("got SIGTSTP pid=%i, pgrp=%i, shell_pgid=%i", getpid(), getpgrp(), data_singleton()->jobc.shell_pgid); ft_putchar('\x1A'); } diff --git a/42sh/src/job-control/sigttin_handler.c b/42sh/src/job-control/sigttin_handler.c index 95197fce..2f5f9402 100644 --- a/42sh/src/job-control/sigttin_handler.c +++ b/42sh/src/job-control/sigttin_handler.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/10 15:14:53 by jhalford #+# #+# */ -/* Updated: 2017/01/09 16:37:32 by jhalford ### ########.fr */ +/* Updated: 2017/01/22 17:22:10 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/get_lexer_stack.c b/42sh/src/lexer/get_lexer_stack.c index 10ce9b70..b37ec859 100644 --- a/42sh/src/lexer/get_lexer_stack.c +++ b/42sh/src/lexer/get_lexer_stack.c @@ -1,4 +1,16 @@ -#include "lexer.h" +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_lexer_stack.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/03 17:39:45 by jhalford #+# #+# */ +/* Updated: 2017/03/07 19:33:30 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" int get_lexer_stack(t_lexer lexer) { diff --git a/42sh/src/lexer/get_reserved_words.c b/42sh/src/lexer/get_reserved_words.c new file mode 100644 index 00000000..e1c525ff --- /dev/null +++ b/42sh/src/lexer/get_reserved_words.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_reserved_words.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/01/26 00:07:05 by ariard #+# #+# */ +/* Updated: 2017/03/06 17:59:39 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + + +t_rvwords g_rvwords[] = +{ + {"while", TK_WHILE}, + {"done", TK_DONE}, + {"do", TK_DO}, + {"if", TK_IF}, + {"then", TK_THEN}, + {"fi", TK_FI}, + {"elif", TK_ELIF}, + {"else", TK_ELSE}, + {"until", TK_UNTIL}, + {"case", TK_CASE}, + {"esac", TK_ESAC}, + {"for", TK_FOR}, + {"null", 0}, +}; + + +static int recognization_rvwords(t_token *pv_tk) +{ + if (!pv_tk || (pv_tk->type == TK_NEWLINE || pv_tk->type == TK_AMP + || pv_tk->type == TK_SEMI || pv_tk->type == TK_WHILE + || pv_tk->type == TK_DONE || pv_tk->type == TK_DO + || pv_tk->type == TK_IF || pv_tk->type == TK_FI || pv_tk->type == TK_THEN + || pv_tk->type == TK_ELIF || pv_tk->type == TK_ELSE)) + return (1); + return (0); +} + +int get_reserved_words(t_list **alst) +{ + t_token *token; + t_token *pv_tk; + t_token *ante_token; + t_list *temp; + int i; + + temp = *alst; + pv_tk = NULL; + ante_token = NULL; + while (temp) + { + token = temp->content; + //no more comp & + if (recognization_rvwords(pv_tk)) + { + if (token->type == TK_WORD) + { + i = 0; + while (g_rvwords[i].type) + { + if (ft_strcmp(token->data, g_rvwords[i].word) == 0) + token->type = g_rvwords[i].type; + i++; + } + } + } + if (ante_token && (ante_token->type == TK_CASE || ante_token->type == TK_FOR) + && ft_strncmp(token->data, "in", 2) == 0) + token->type = TK_IN; + if (pv_tk && pv_tk->type == TK_FOR && token->type == TK_WORD) + token->type = TK_NAME; + ante_token = pv_tk; + pv_tk = token; + temp = temp->next; + } + return (0); +} diff --git a/42sh/src/lexer/get_state_global.c b/42sh/src/lexer/get_state_global.c index 38847ae2..5fd8532e 100644 --- a/42sh/src/lexer/get_state_global.c +++ b/42sh/src/lexer/get_state_global.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 20:39:06 by jhalford #+# #+# */ -/* Updated: 2017/02/09 22:12:45 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 19:33:58 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" t_lexstate get_state_global(t_lexer *lexer) { @@ -19,9 +19,7 @@ t_lexstate get_state_global(t_lexer *lexer) c = lexer->str[lexer->pos]; if (ft_is_delim(c)) return (DELIM); - else if (c == '#') - return (COMMENT); - else if (c == '&' || c == ';' || c == '|') + else if (c == '&' || c == ';' || c == '|' || c == '!') return (SEP); else if (c == '\\') return (BACKSLASH); @@ -33,6 +31,8 @@ t_lexstate get_state_global(t_lexer *lexer) return (BQUOTE); else if (c == '(' || c == ')') return (PAREN); + else if (c == '{' || c == '}') + return (CURLY_BRACKETS); else if (c == 0) return (END); return (0); diff --git a/42sh/src/lexer/get_state_redir.c b/42sh/src/lexer/get_state_redir.c index 7b6acd31..d4d60d3b 100644 --- a/42sh/src/lexer/get_state_redir.c +++ b/42sh/src/lexer/get_state_redir.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 20:37:28 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:39:11 by jhalford ### ########.fr */ +/* Updated: 2017/02/24 20:44:40 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" t_lexstate get_state_redir(t_lexer *lexer) { diff --git a/42sh/src/lexer/insert_newline.c b/42sh/src/lexer/insert_newline.c new file mode 100644 index 00000000..8cd60a2a --- /dev/null +++ b/42sh/src/lexer/insert_newline.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* insert_newline.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/21 21:05:23 by ariard #+# #+# */ +/* Updated: 2017/03/08 18:33:31 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int insert_newline(t_list **alst) +{ + t_token *token; + + token = token_init(); + token->type = TK_NEWLINE; + ft_lsteadd(alst, ft_lstnew(token, sizeof(*token))); + return (0); +} diff --git a/42sh/src/lexer/lexer_assignement_word.c b/42sh/src/lexer/lexer_assignement_word.c new file mode 100644 index 00000000..2f802e33 --- /dev/null +++ b/42sh/src/lexer/lexer_assignement_word.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_assignement_word.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/24 20:28:13 by ariard #+# #+# */ +/* Updated: 2017/03/07 18:36:23 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int lexer_assignement_word(t_list **alst, t_lexer *lexer) +{ + t_token *token; + char c; + + token = (*alst)->content; + if (token->type != TK_WORD && token->type != TK_ASSIGNEMENT_WORD) + { + token_append(token, lexer, 0, 0); + lexer->pos++; + return (lexer_lex(alst, lexer)); + } + token->type = TK_ASSIGNEMENT_WORD; + token_append(token, lexer, 0, 0); + lexer->pos++; + c = lexer->str[lexer->pos]; + if ((lexer->state = get_state_global(lexer))) + return (lexer_lex(alst, lexer)); + if ((lexer->state = get_state_redir(lexer))) + return (lexer_lex(alst, lexer)); + lexer->state = ft_isdigit(c) ? NUMBER : ASSIGNEMENT_WORD; + return(lexer_lex(alst, lexer)); +} diff --git a/42sh/src/lexer/lexer_backslash.c b/42sh/src/lexer/lexer_backslash.c index 6cf7adf0..3418e2a2 100644 --- a/42sh/src/lexer/lexer_backslash.c +++ b/42sh/src/lexer/lexer_backslash.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:56:49 by jhalford #+# #+# */ -/* Updated: 2017/02/09 19:53:50 by jhalford ### ########.fr */ +/* Updated: 2017/02/20 22:04:36 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_backslash(t_list **alst, t_lexer *lexer) { diff --git a/42sh/src/lexer/lexer_bquote.c b/42sh/src/lexer/lexer_bquote.c index 75f0ae27..aa958410 100644 --- a/42sh/src/lexer/lexer_bquote.c +++ b/42sh/src/lexer/lexer_bquote.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 22:03:48 by jhalford #+# #+# */ -/* Updated: 2017/03/07 15:18:24 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:32:14 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_bquote(t_list **alst, t_lexer *lexer) { diff --git a/42sh/src/lexer/lexer_comment.c b/42sh/src/lexer/lexer_curly_braces.c similarity index 54% rename from 42sh/src/lexer/lexer_comment.c rename to 42sh/src/lexer/lexer_curly_braces.c index 71f053cd..d6eee381 100644 --- a/42sh/src/lexer/lexer_comment.c +++ b/42sh/src/lexer/lexer_curly_braces.c @@ -1,23 +1,35 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* lexer_comment.c :+: :+: :+: */ +/* lexer_curly_braces.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/07 12:15:59 by jhalford #+# #+# */ -/* Updated: 2017/02/09 19:54:11 by jhalford ### ########.fr */ +/* Created: 2017/03/05 16:29:35 by jhalford #+# #+# */ +/* Updated: 2017/03/05 16:29:36 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" -int lexer_comment(t_list **alst, t_lexer *lexer) +int lexer_curly_braces(t_list **alst, t_lexer *lexer) { - t_token *token; + t_token *token; token = (*alst)->content; - if (lexer->str[lexer->pos] == '\n') - return (lexer_lex(&(*alst)->next, lexer)); - return (lexer_comment(alst, lexer)); + if (token->type) + lexer_lex(&(*alst)->next, lexer); + if (lexer->str[lexer->pos] == '{') + { + token->type = TK_LBRACE; + push(&lexer->stack, PAREN); + } + else if (get_lexer_stack(*lexer)) + { + token->type = TK_RBRACE; + pop(&lexer->stack); + } + lexer->pos++; + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } diff --git a/42sh/src/lexer/lexer_default.c b/42sh/src/lexer/lexer_default.c index 777d6f11..a2802c5c 100644 --- a/42sh/src/lexer/lexer_default.c +++ b/42sh/src/lexer/lexer_default.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:21 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:40:28 by jhalford ### ########.fr */ +/* Updated: 2017/03/05 16:20:18 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_default(t_list **alst, t_lexer *lexer) { diff --git a/42sh/src/lexer/lexer_delim.c b/42sh/src/lexer/lexer_delim.c index d4571deb..72b7c47c 100644 --- a/42sh/src/lexer/lexer_delim.c +++ b/42sh/src/lexer/lexer_delim.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:58:44 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:02:45 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 12:09:52 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_delim(t_list **alst, t_lexer *lexer) { @@ -21,9 +21,7 @@ int lexer_delim(t_list **alst, t_lexer *lexer) lexer->pos++; lexer->state = DEFAULT; if (token->type) - { return (lexer_lex(&(*alst)->next, lexer)); - } else { if (lexer->str[lexer->pos] == 0) diff --git a/42sh/src/lexer/lexer_dless.c b/42sh/src/lexer/lexer_dless.c deleted file mode 100644 index f0e0ee4d..00000000 --- a/42sh/src/lexer/lexer_dless.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "lexer.h" - -int lexer_dless(t_list **alst, t_lexer *lexer) -{ - t_list *heredoc_lst; - t_token *eof_tok; - t_token *heredoc_tok; - - (void)alst; - (void)lexer; - heredoc_lst = *(t_list**)lexer->heredoc_stack->content; - heredoc_tok = heredoc_lst->content; - if (!(heredoc_lst->next)) - { - ft_dprintf(2, "{red}%s: parse error near `\\n'{eoc}\n", SHELL_NAME); - return (1); - } - eof_tok = heredoc_lst->next->content; - if (!(eof_tok->type == TK_WORD)) - { - ft_dprintf(2, "{red}%s: expected word token after <<{eoc}\n", SHELL_NAME); - return (1); - } - DG("heredoc contains [%s]", heredoc_tok->data); - DG("heredoc ends at [%s]", eof_tok->data); - DG("input is [%s]", lexer->str + lexer->pos); - if (ft_strcmp(eof_tok->data, lexer->str + lexer->pos) == 0) - { - pop(&lexer->stack); - pop(&lexer->heredoc_stack); - while (lexer->str[++lexer->pos]) - ; - ft_strappend(&lexer->str, (char[]){'\n', 0}); - lexer->pos++; - return (0); - } - else - while (lexer->str[lexer->pos]) - token_append_char(heredoc_tok, lexer->str[lexer->pos++], 0, 0); - return (lexer_end(alst, lexer)); -} diff --git a/42sh/src/lexer/lexer_dquote.c b/42sh/src/lexer/lexer_dquote.c index c3cdfcbd..10455689 100644 --- a/42sh/src/lexer/lexer_dquote.c +++ b/42sh/src/lexer/lexer_dquote.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 18:36:58 by jhalford #+# #+# */ -/* Updated: 2017/02/17 15:36:36 by jhalford ### ########.fr */ +/* Updated: 2017/03/05 17:09:20 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_dquote(t_list **alst, t_lexer *lexer) { diff --git a/42sh/src/lexer/lexer_end.c b/42sh/src/lexer/lexer_end.c index 2ec70dd2..ec527e69 100644 --- a/42sh/src/lexer/lexer_end.c +++ b/42sh/src/lexer/lexer_end.c @@ -1,26 +1,29 @@ -#include "lexer.h" +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_end.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/05 16:58:24 by jhalford #+# #+# */ +/* Updated: 2017/03/08 17:52:05 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" int lexer_end(t_list **alst, t_lexer *lexer) { t_token *token; - if ((*alst && (lexer->state == QUOTE + if (*alst && (lexer->state == QUOTE || lexer->state == DQUOTE || lexer->state == BQUOTE)) - || get_lexer_stack(*lexer) == DLESS) { + token = (*alst)->content; ft_strappend(&lexer->str, (char[]){'\n', 0}); + token_append_char(token, '\n', 1, 0); lexer->pos++; - if (get_lexer_stack(*lexer) == DLESS) - { - token = (*(t_list**)lexer->heredoc_stack->content)->content; - token_append_char(token, '\n', 0, 0); - } - else - { - token = (*alst)->content; - token_append_char(token, '\n', 1, 0); - } return (0); } return (0); diff --git a/42sh/src/lexer/lexer_great.c b/42sh/src/lexer/lexer_great.c index 12b7275a..333504a1 100644 --- a/42sh/src/lexer/lexer_great.c +++ b/42sh/src/lexer/lexer_great.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:35 by jhalford #+# #+# */ -/* Updated: 2017/02/09 19:57:29 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 12:10:46 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_great(t_list **alst, t_lexer *lexer) { @@ -23,6 +23,7 @@ int lexer_great(t_list **alst, t_lexer *lexer) lexer->pos++; if (lexer->str[lexer->pos] == '&') { + DG("lex greatand"); token->type = TK_GREATAND; token_append(token, lexer, 0, 0); lexer->pos++; @@ -30,16 +31,14 @@ int lexer_great(t_list **alst, t_lexer *lexer) } if (lexer->str[lexer->pos] == '>') { + DG("lex great"); token->type = TK_DGREAT; token_append(token, lexer, 0, 0); lexer->pos++; lexer->state = DEFAULT; return (lexer_lex(&(*alst)->next, lexer)); } - else - { - token->type = TK_GREAT; - lexer->state = DEFAULT; - return (lexer_lex(&(*alst)->next, lexer)); - } + token->type = TK_GREAT; + 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 9d49d4d8..c7f17888 100644 --- a/42sh/src/lexer/lexer_greatand.c +++ b/42sh/src/lexer/lexer_greatand.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:56:58 by jhalford #+# #+# */ -/* Updated: 2017/02/09 19:56:40 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:34:08 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_greatand(t_list **alst, t_lexer *lexer) { @@ -18,20 +18,6 @@ int lexer_greatand(t_list **alst, t_lexer *lexer) token = (*alst)->content; token->type = TK_GREATAND; - DG("lexer->str=[%s]", lexer->str + lexer->pos); - if (ft_isdigit(lexer->str[lexer->pos])) - { - token_append(token, lexer, 0, 0); - lexer->pos++; - return (lexer_greatand(alst, lexer)); - } - else if (lexer->str[lexer->pos] == '-') - { - token_append(token, lexer, 0, 0); - lexer->pos++; - lexer->state = DEFAULT; - return (lexer_lex(&(*alst)->next, lexer)); - } lexer->state = DEFAULT; return (lexer_lex(&(*alst)->next, lexer)); } diff --git a/42sh/src/main/remove_trailing_esc_nl.c b/42sh/src/lexer/lexer_heredoc.c similarity index 63% rename from 42sh/src/main/remove_trailing_esc_nl.c rename to 42sh/src/lexer/lexer_heredoc.c index 9d6fb232..7f0d9c63 100644 --- a/42sh/src/main/remove_trailing_esc_nl.c +++ b/42sh/src/lexer/lexer_heredoc.c @@ -1,26 +1,25 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* remove_trailing_esc_nl.c :+: :+: :+: */ +/* lexer_heredoc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/09 16:52:34 by jhalford #+# #+# */ -/* Updated: 2017/02/09 17:00:33 by jhalford ### ########.fr */ +/* Created: 2017/03/08 15:51:17 by jhalford #+# #+# */ +/* Updated: 2017/03/08 23:19:57 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int remove_trailing_esc_nl(char *str) +int lexer_heredoc(t_list **alst, t_lexer *lexer) { - char *last; + t_token *token; - last = str + ft_strlen(str) - 1; - if (*last == '\\') - { - *last = 0; - return (1); - } + token = (*alst)->content; + token->type = HEREDOCDATA; + while (lexer->str[lexer->pos]) + if (token_append_char(token, lexer->str[lexer->pos++], 0, 0)) + return (1); return (0); } diff --git a/42sh/src/lexer/lexer_init.c b/42sh/src/lexer/lexer_init.c index 230ee3f6..a7000895 100644 --- a/42sh/src/lexer/lexer_init.c +++ b/42sh/src/lexer/lexer_init.c @@ -1,4 +1,16 @@ -#include "lexer.h" +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/21 16:14:08 by ariard #+# #+# */ +/* Updated: 2017/03/04 16:32:15 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" void lexer_init(t_lexer *lexer) { diff --git a/42sh/src/lexer/lexer_less.c b/42sh/src/lexer/lexer_less.c index ef97e839..7f54359c 100644 --- a/42sh/src/lexer/lexer_less.c +++ b/42sh/src/lexer/lexer_less.c @@ -6,43 +6,32 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:53 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:37:37 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:34:58 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_less(t_list **alst, t_lexer *lexer) { t_token *token; token = (*alst)->content; - /* if (token->type) */ - /* return (lexer_lex(&(*alst)->next, lexer)); */ - token_append(token, lexer, 0, 0); lexer->pos++; if (lexer->str[lexer->pos] == '&') { token->type = TK_LESSAND; - token_append(token, lexer, 0, 0); lexer->pos++; return (lexer_lessand(alst, lexer)); } if (lexer->str[lexer->pos] == '<') { - token_free(token, 0); - (*alst)->content = token_init(); token->type = TK_DLESS; lexer->pos++; - push(&lexer->stack, DLESS); - lexer->state = DEFAULT; - ft_lsteadd(&lexer->heredoc_stack, ft_lstnew(alst, sizeof(alst))); - return (lexer_lex(&(*alst)->next, lexer)); - } - else - { - token->type = TK_LESS; lexer->state = DEFAULT; return (lexer_lex(&(*alst)->next, lexer)); } + token->type = TK_LESS; + 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 f411b225..3930c001 100644 --- a/42sh/src/lexer/lexer_lessand.c +++ b/42sh/src/lexer/lexer_lessand.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:58:51 by jhalford #+# #+# */ -/* Updated: 2017/02/09 19:56:29 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 12:12:01 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_lessand(t_list **alst, t_lexer *lexer) { @@ -18,11 +18,14 @@ int lexer_lessand(t_list **alst, t_lexer *lexer) token = (*alst)->content; token->type = TK_LESSAND; - if (ft_isdigit(lexer->str[lexer->pos])) + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); +/* if (ft_isdigit(lexer->str[lexer->pos])) { token_append(token, lexer, 0, 0); lexer->pos++; - return (lexer_lessand(alst, lexer)); + lexer->state = DEFAULT; + return (lexer_lex(&(*alst)->next, lexer)); } else if (lexer->str[lexer->pos] == '-') { @@ -32,5 +35,5 @@ int lexer_lessand(t_list **alst, t_lexer *lexer) return (lexer_lex(&(*alst)->next, lexer)); } lexer->state = DEFAULT; - return (lexer_lex(alst, lexer)); + return (lexer_lex(alst, lexer));*/ } diff --git a/42sh/src/lexer/lexer_lex.c b/42sh/src/lexer/lexer_lex.c index f6614e5a..7a32b1d7 100644 --- a/42sh/src/lexer/lexer_lex.c +++ b/42sh/src/lexer/lexer_lex.c @@ -6,15 +6,17 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 17:08:51 by jhalford #+# #+# */ -/* Updated: 2017/02/09 22:58:48 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 15:51:39 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int (*g_lexer[])(t_list **alst, t_lexer *lexer) = { &lexer_default, + &lexer_paren, + &lexer_heredoc, &lexer_newline, &lexer_delim, &lexer_sep, @@ -24,27 +26,34 @@ int (*g_lexer[])(t_list **alst, t_lexer *lexer) = &lexer_great, &lexer_lessand, &lexer_greatand, - &lexer_dless, &lexer_quote, &lexer_dquote, &lexer_bquote, &lexer_bquote, &lexer_backslash, - &lexer_paren, - &lexer_comment, + &lexer_curly_braces, + &lexer_assignement_word, &lexer_end, }; int ft_is_delim(char c) { - return (c == ' ' || c == '\t' || c == '\n'); + return (c == ' ' || c == '\t'); +} + +int ft_is_delim_list(char c) +{ + return (c == ';' || c == '\n' || c == '&'); } int lexer_lex(t_list **alst, t_lexer *lexer) { t_token *token; - if (lexer->str[lexer->pos] == 0) + if (lexer->str[lexer->pos] == 0 + || (lexer->str[lexer->pos] == '#' + && lexer->state != QUOTE + && lexer->state != DQUOTE)) return (lexer_end(alst, lexer)); if (!*alst) { diff --git a/42sh/src/lexer/lexer_newline.c b/42sh/src/lexer/lexer_newline.c index 396dc6d3..b2256091 100644 --- a/42sh/src/lexer/lexer_newline.c +++ b/42sh/src/lexer/lexer_newline.c @@ -6,11 +6,11 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/23 23:19:46 by ariard #+# #+# */ -/* Updated: 2017/02/09 19:55:04 by jhalford ### ########.fr */ +/* Updated: 2017/03/03 18:00:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_newline(t_list **alst, t_lexer *lexer) { diff --git a/42sh/src/lexer/lexer_number.c b/42sh/src/lexer/lexer_number.c index bb8e0dea..203308b8 100644 --- a/42sh/src/lexer/lexer_number.c +++ b/42sh/src/lexer/lexer_number.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:06:45 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:41:05 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:35:37 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_number(t_list **alst, t_lexer *lexer) { @@ -18,18 +18,34 @@ int lexer_number(t_list **alst, t_lexer *lexer) t_lexstate state; token = (*alst)->content; + token->type = TK_IO_NUMBER; if ((state = get_state_global(lexer)) || (state = get_state_redir(lexer))) { lexer->state = state; return (lexer_lex(alst, lexer)); } - else if (ft_isdigit(lexer->str[lexer->pos])) + else if (ft_isdigit(lexer->str[lexer->pos]) + && ft_isdigit(lexer->str[lexer->pos + 1])) { token_append(token, lexer, 0, 0); lexer->pos++; return (lexer_number(alst, lexer)); } - lexer->state = DEFAULT; - return (lexer_lex(alst, lexer)); + else if (ft_isdigit(lexer->str[lexer->pos]) + && (lexer->str[lexer->pos + 1] == '>' + || lexer->str[lexer->pos + 1] == '<')) + { + token_append(token, lexer, 0, 0); + lexer->pos++; + return (lexer_lex(&(*alst)->next, lexer)); + } + else + { + token->type = TK_WORD; + lexer->state = DEFAULT; + token_append(token, lexer, 0, 0); + lexer->pos++; + return (lexer_lex(alst, lexer)); + } } diff --git a/42sh/src/lexer/lexer_paren.c b/42sh/src/lexer/lexer_paren.c index dd795357..5abf4b69 100644 --- a/42sh/src/lexer/lexer_paren.c +++ b/42sh/src/lexer/lexer_paren.c @@ -1,31 +1,35 @@ -#include "lexer.h" +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_paren.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/03 17:37:15 by jhalford #+# #+# */ +/* Updated: 2017/03/08 12:14:09 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.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; + token = (*alst)->content; + if (token->type) + return (lexer_lex(&(*alst)->next, lexer)); if (lexer->str[lexer->pos] == '(') { token->type = TK_PAREN_OPEN; push(&lexer->stack, PAREN); } - else if (lexer->stack && *(int*)lexer->stack->content == PAREN) + else if (get_lexer_stack(*lexer)) { token->type = TK_PAREN_CLOSE; pop(&lexer->stack); } lexer->pos++; lexer->state = DEFAULT; - return (lexer_lex(&(*lst)->next, lexer)); + return (lexer_lex(&(*alst)->next, lexer)); } diff --git a/42sh/src/lexer/lexer_quote.c b/42sh/src/lexer/lexer_quote.c index 9b1afbd1..67cbc4c7 100644 --- a/42sh/src/lexer/lexer_quote.c +++ b/42sh/src/lexer/lexer_quote.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int lexer_quote(t_list **alst, t_lexer *lexer) { diff --git a/42sh/src/lexer/lexer_sep.c b/42sh/src/lexer/lexer_sep.c index a393f714..980aad75 100644 --- a/42sh/src/lexer/lexer_sep.c +++ b/42sh/src/lexer/lexer_sep.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 16:29:57 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:43:25 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 17:11:35 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,25 +19,20 @@ int lexer_sep(t_list **alst, t_lexer *lexer) char cn; lexer->state = DEFAULT; - if (*alst) - { - token = (*alst)->content; - if (*token->data) - return (lexer_sep(&(*alst)->next, lexer)); - } - else - { - token = token_init(); - *alst = ft_lstnew(token, sizeof(*token)); - } token = (*alst)->content; + if (token->type) + return (lexer_lex(&(*alst)->next, lexer)); c = lexer->str[lexer->pos]; - cn = lexer->str[lexer->pos + 1]; + lexer->pos++; + cn = lexer->str[lexer->pos]; 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); + else if (c == ';') + token->type = cn == ';' ? TK_DSEMI : TK_SEMI; + if (token->type == TK_AND_IF || token->type == TK_OR_IF + || token->type == TK_DSEMI) + lexer->pos++; return (lexer_lex(&(*alst)->next, lexer)); } diff --git a/42sh/src/lexer/lexer_word.c b/42sh/src/lexer/lexer_word.c index 0ef25c63..b2643688 100644 --- a/42sh/src/lexer/lexer_word.c +++ b/42sh/src/lexer/lexer_word.c @@ -6,28 +6,30 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:11 by jhalford #+# #+# */ -/* Updated: 2017/02/09 20:43:57 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:36:13 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" -int lexer_word(t_list **alst, t_lexer *lexer) +int lexer_word(t_list **alst, t_lexer *lexer) { t_token *token; t_lexstate state; token = (*alst)->content; token->type = TK_WORD; - if ((state = get_state_global(lexer))) + if ((state = get_state_global(lexer)) + || (state = get_state_redir(lexer))) { lexer->state = state; return (lexer_lex(alst, lexer)); } - if ((state = get_state_redir(lexer))) + if (lexer->str[lexer->pos] == '=' + && word_is_assignment((char *[]){token->data, (char *)token->esc})) { - lexer->state = state; - return (lexer_lex(&(*alst)->next, lexer)); + lexer->state = ASSIGNEMENT_WORD; + return (lexer_lex(alst, lexer)); } token_append(token, lexer, 0, 0); lexer->pos++; diff --git a/42sh/src/lexer/reduce_parens.c b/42sh/src/lexer/reduce_parens.c deleted file mode 100644 index b189bd05..00000000 --- a/42sh/src/lexer/reduce_parens.c +++ /dev/null @@ -1,50 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* reduce_parens.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/11 16:13:31 by jhalford #+# #+# */ -/* Updated: 2017/02/06 14:36:54 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "lexer.h" - -int reduce_parens(t_list **alst, char *str) -{ - t_list *start; - t_list *end; - t_token *token; - int num_p; - int tk; - - (void)str; - tk = TK_PAREN_OPEN; - if ((start = ft_lst_find(*alst, &tk, token_cmp_type))) - { - end = start->next; - num_p = 1; - while (end) - { - token = end->content; - if (token->type == TK_PAREN_OPEN) - num_p++; - else if (token->type == TK_PAREN_CLOSE) - num_p--; - if (num_p == 0) - break ; - end = end->next; - ft_lst_delif(alst, token, ft_addrcmp, token_free); - } - if (!end) - return (-1); - token = start->content; - token->type = TK_SUBSHELL; - token->data = ft_strbetween(token->data + 1, ((t_token*)end->content)->data); - ft_lst_delif(alst, end->content, ft_addrcmp, token_free); - return (1); - } - return (0); -} diff --git a/42sh/src/lexer/stack_to_prompt.c b/42sh/src/lexer/stack_to_prompt.c deleted file mode 100644 index 3a5cc8ff..00000000 --- a/42sh/src/lexer/stack_to_prompt.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* stack_to_prompt.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/09 21:25:26 by jhalford #+# #+# */ -/* Updated: 2017/02/17 14:41:08 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 == DQUOTE_BQUOTE) - return ("dquote bquote> "); - else if (top == PAREN) - return ("subsh> "); - else if (top == DLESS) - return ("heredoc> "); - else - return ("error> "); -} diff --git a/42sh/src/lexer/token_append.c b/42sh/src/lexer/token_append.c index 9dbafd27..72a5617b 100644 --- a/42sh/src/lexer/token_append.c +++ b/42sh/src/lexer/token_append.c @@ -6,12 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/11 17:18:42 by jhalford #+# #+# */ -/* Updated: 2017/02/09 17:00:41 by wescande ### ########.fr */ +/* Updated: 2017/03/08 17:45:08 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" - +#include "minishell.h" int token_append_char(t_token *token, char c, short int esc, short int esc2) diff --git a/42sh/src/lexer/token_cmp_type.c b/42sh/src/lexer/token_cmp_type.c index 08f3ab87..4185bc7b 100644 --- a/42sh/src/lexer/token_cmp_type.c +++ b/42sh/src/lexer/token_cmp_type.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 17:08:55 by jhalford #+# #+# */ -/* Updated: 2016/12/05 13:35:53 by jhalford ### ########.fr */ +/* Updated: 2017/01/24 16:02:48 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" int token_cmp_type(t_token *token, t_type *ref) { diff --git a/42sh/src/lexer/token_free.c b/42sh/src/lexer/token_free.c index afaf28b5..148ff2b6 100644 --- a/42sh/src/lexer/token_free.c +++ b/42sh/src/lexer/token_free.c @@ -6,11 +6,11 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 12:07:30 by jhalford #+# #+# */ -/* Updated: 2017/02/09 17:00:44 by wescande ### ########.fr */ +/* Updated: 2017/03/08 13:22:19 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" void token_free(void *data, size_t size) { diff --git a/42sh/src/lexer/token_init.c b/42sh/src/lexer/token_init.c index 280ed495..3e58f078 100644 --- a/42sh/src/lexer/token_init.c +++ b/42sh/src/lexer/token_init.c @@ -6,17 +6,18 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 15:30:25 by jhalford #+# #+# */ -/* Updated: 2017/02/09 17:00:52 by wescande ### ########.fr */ +/* Updated: 2017/03/08 13:21:55 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" t_token *token_init(void) { t_token *token; token = (t_token *)malloc(sizeof(t_token)); +//non protege token->type = 0; token->size = 8; token->data = ft_strnew(token->size + 1); diff --git a/42sh/src/lexer/token_print.c b/42sh/src/lexer/token_print.c index 7f102fa2..c17e1605 100644 --- a/42sh/src/lexer/token_print.c +++ b/42sh/src/lexer/token_print.c @@ -6,28 +6,22 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:39:01 by jhalford #+# #+# */ -/* Updated: 2017/02/07 12:11:24 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 12:14:32 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "lexer.h" +#include "minishell.h" void token_print(t_list *lst) { t_token *token; - int i; - t_type type; - int index; while (lst) { - i = -1; - token = lst->content; - type = token->type; - while (type >> (i++ + 2)) - ; - DG("%02i:[%s]", i, token->data); - index = -1; + if (lst->content) + token = lst->content; + if (token->type) + DG("token : %s data [%s]", read_state(token->type), token->data); lst = lst->next; } } diff --git a/42sh/src/line-editing/control_features.c b/42sh/src/line-editing/control_features.c index cfc57840..c23c0591 100644 --- a/42sh/src/line-editing/control_features.c +++ b/42sh/src/line-editing/control_features.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/02 15:17:28 by gwojda #+# #+# */ -/* Updated: 2017/03/05 19:36:56 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 23:36:31 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/ft_prompt.c b/42sh/src/line-editing/ft_prompt.c index 515b5b59..30a88a7c 100644 --- a/42sh/src/line-editing/ft_prompt.c +++ b/42sh/src/line-editing/ft_prompt.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:51:33 by gwojda #+# #+# */ -/* Updated: 2017/03/07 17:32:22 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 23:38:22 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,7 +16,6 @@ static int promt_git_status(int fd) { int len; char *tmp; - char *line; get_next_line(fd, &line); tmp = line; @@ -42,15 +41,16 @@ static int promt_git_status(int fd) static int ft_git_status(void) { - static char *exec[] = {"git", "status", "--porcelain", "--branch", NULL}; int pip[2]; - pid_t soon; + pid_t soon; + char *exec[] = {"git", "status", "--porcelain", "--branch", NULL}; + int ret; pipe(pip); if ((soon = fork())) { - wait(&soon); - if (WEXITSTATUS(soon)) + waitpid(soon, &ret, WUNTRACED); + if (WEXITSTATUS(ret)) return (-1); close(pip[1]); return (promt_git_status(pip[0])); diff --git a/42sh/src/line-editing/lib_line_editing/tool_line.c b/42sh/src/line-editing/lib_line_editing/tool_line.c index 4047df37..f3b07f70 100644 --- a/42sh/src/line-editing/lib_line_editing/tool_line.c +++ b/42sh/src/line-editing/lib_line_editing/tool_line.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/20 18:20:23 by gwojda #+# #+# */ -/* Updated: 2017/02/03 17:50:48 by gwojda ### ########.fr */ +/* Updated: 2017/03/04 18:51:45 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/lib_line_editing/toolz.c b/42sh/src/line-editing/lib_line_editing/toolz.c index 8f872021..6fd315c8 100644 --- a/42sh/src/line-editing/lib_line_editing/toolz.c +++ b/42sh/src/line-editing/lib_line_editing/toolz.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/16 17:06:30 by gwojda #+# #+# */ -/* Updated: 2017/02/04 18:16:34 by gwojda ### ########.fr */ +/* Updated: 2017/03/04 18:52:22 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/lib_line_editing/toolz_parseur.c b/42sh/src/line-editing/lib_line_editing/toolz_parseur.c index a0781e12..7c14dc9b 100644 --- a/42sh/src/line-editing/lib_line_editing/toolz_parseur.c +++ b/42sh/src/line-editing/lib_line_editing/toolz_parseur.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/16 16:14:46 by gwojda #+# #+# */ -/* Updated: 2017/02/02 14:29:34 by gwojda ### ########.fr */ +/* Updated: 2017/03/05 15:31:42 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,12 +14,12 @@ char *ft_realloc_imput(char *str, int a, size_t pos) { - int i; +// int i; char tmp[2]; char *str_tmp; char *new_str; - i = 0; +// i = 0; tmp[0] = (char)a; tmp[1] = '\0'; if (!str) diff --git a/42sh/src/line-editing/lib_line_editing/toolz_termcaps.c b/42sh/src/line-editing/lib_line_editing/toolz_termcaps.c index 21d16e28..75d0ec34 100644 --- a/42sh/src/line-editing/lib_line_editing/toolz_termcaps.c +++ b/42sh/src/line-editing/lib_line_editing/toolz_termcaps.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/08 12:35:11 by gwojda #+# #+# */ -/* Updated: 2017/03/07 17:33:05 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 23:38:50 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/line-editing/move_up_and_down.c b/42sh/src/line-editing/move_up_and_down.c index 26eaa8d8..742f232a 100644 --- a/42sh/src/line-editing/move_up_and_down.c +++ b/42sh/src/line-editing/move_up_and_down.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/09 13:21:40 by gwojda #+# #+# */ -/* Updated: 2017/02/14 11:18:54 by gwojda ### ########.fr */ +/* Updated: 2017/03/05 15:32:18 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,9 +40,9 @@ static void ft_up_2(size_t *pos, char *str) void ft_up(void) { - int i; +// int i; - i = 0; +// i = 0; if (!STR || !POS) return ; if (STR[POS - 1] == '\n') diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index f2501d7e..eda73bfb 100644 --- a/42sh/src/line-editing/readline.c +++ b/42sh/src/line-editing/readline.c @@ -6,24 +6,111 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 14:19:48 by gwojda #+# #+# */ -/* Updated: 2017/03/07 17:35:13 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 23:39:53 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -char *readline(char *prompt) +void ft_init_line(void) { - char *input; + data_singleton()->line.input = NULL; + data_singleton()->line.copy_tmp = NULL; + data_singleton()->line.pos = 0; + data_singleton()->line.prompt_size = 0; + data_singleton()->line.list_size = 0; + data_singleton()->line.list_end = NULL; + data_singleton()->line.list_beg = NULL; + data_singleton()->line.opt = 0; +} - readline_init(prompt); - input = ft_read_stdin(); +void ft_init_history(void) +{ + int fd; + char *str; + char *home; + char *path; + + if (!(home = ft_getenv(data_singleton()->env, "HOME"))) + return ; + path = ft_str3join(home, "/", ".42sh_history"); + fd = open(path, O_RDONLY); + if (fd == -1) + return ; + while (get_next_line(fd, &str) > 0) + { + if (!*str) + continue ; + ft_push_back_history(&data_singleton()->line.list_beg, + ft_create_history_list(str)); + free(str); + } + free(path); + free(str); + close(fd); +} + +struct termios *ft_save_termios(int save) +{ + static struct termios *term_save = NULL; + + if (save < 0) + { + free(term_save); + return (NULL); + } + if (save > 0) + { + term_save = (struct termios *)malloc(sizeof(struct termios)); + tcgetattr(0, term_save); + } + return (term_save); +} + +void ft_init_termios(void) +{ + struct termios 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(int prompt) +{ + static int beg = 0; + + if (!beg) + { + ft_init_line(); + ft_init_history(); + ft_save_termios(1); + beg = 1; + } + ft_init_termios(); if (STR) - ft_current_str(STR, POS); + ft_strdel(&STR); + data_singleton()->line.list_cur = data_singleton()->line.list_beg; + POS = 0; + prompt ? ft_putstr("> ") : ft_prompt(); +} + +int readline(int fd, int prompt, char **input) +{ + if (!SH_IS_INTERACTIVE(data_singleton()->opts)) + { + if (get_next_line(fd, input) == 0) + return (1); + return (0); + } + readline_init(prompt); + *input = ft_read_stdin(); ft_putchar('\n'); if (!prompt) - input = ft_history_parsing(); + *input = ft_history_parsing(); if (tcsetattr(0, TCSANOW, ft_save_termios(0)) == -1) - return (NULL); - return (input); + return (-1); + return (0); } diff --git a/42sh/src/main/data_exit.c b/42sh/src/main/data_exit.c index e22c741d..30acbb44 100644 --- a/42sh/src/main/data_exit.c +++ b/42sh/src/main/data_exit.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/07 18:07:50 by jhalford #+# #+# */ -/* Updated: 2017/01/10 13:16:38 by jhalford ### ########.fr */ +/* Updated: 2017/01/22 17:20:29 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index 1ab4c90d..a3026aca 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/03/07 15:21:17 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:40:20 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,30 +21,17 @@ int data_init(void) data = data_singleton(); data->env = ft_sstrdup(environ); + set_exitstatus(0, 1); data->comp = NULL; - data->opts = SH_OPTS_JOBC; - - data->exec.process.path = NULL; - data->exec.process.av = NULL; - data->exec.process.toclose = STDIN; - data->exec.process.fdin = STDIN; - data->exec.process.fdout = STDOUT; - data->exec.process.pid = 0; - data->exec.process.attributes = PROCESS_PIPESTART | PROCESS_PIPEEND; - data->exec.process.redirs = NULL; - data->exec.fd0save = fcntl(0, F_DUPFD_CLOEXEC); - data->exec.fd1save = fcntl(1, F_DUPFD_CLOEXEC); - data->exec.fd2save = fcntl(2, F_DUPFD_CLOEXEC); - - data->exec.aol_status = NULL; - data->exec.aol_search = 0; - data->exec.job.id = 0; - data->exec.job.pgid = 0; - data->exec.job.attributes = 0; - data->exec.job.first_process = 0; + data->opts = 0; + exec_reset(); data->jobc.first_job = NULL; data->jobc.current_id = 1; + + data->local_var = NULL; + data->lst_func = NULL; + data->heredoc_queue = NULL; if ((term_name = ft_getenv(data->env, "TERM")) == NULL) return (-1); if (tgetent(NULL, term_name) != 1) diff --git a/42sh/src/main/data_singleton.c b/42sh/src/main/data_singleton.c index e73ed322..51fe1e00 100644 --- a/42sh/src/main/data_singleton.c +++ b/42sh/src/main/data_singleton.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/10 11:36:39 by jhalford #+# #+# */ -/* Updated: 2017/02/04 10:55:39 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 20:50:57 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/main/ft_putast.c b/42sh/src/main/ft_putast.c index 89e9f60d..b223e7e3 100644 --- a/42sh/src/main/ft_putast.c +++ b/42sh/src/main/ft_putast.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */ -/* Updated: 2017/01/10 14:18:53 by jhalford ### ########.fr */ +/* Updated: 2017/03/07 23:35:32 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,13 +15,52 @@ char *ft_putast(void *nodein) { t_astnode *node; - struct s_tmp{ - char str[5]; - t_type type; - }; node = nodein; - if (node->type == TK_AMP) + + if (node->type == MATH) + return ("MATH"); + if (node->type == TK_DSEMI) + return ("TK_DSEMI"); + if (node->type == WORDLIST) + return ("WORDLIST"); + if (node->type == CMD) + return ("CMD"); + if (node->type == REDIR) + return ("REDIR"); + if (node->type == CLOSE_LIST) + return ("CLOSE_LIST"); + if (node->type == FNAME) + return ("FNAME"); + if (node->type == TK_LBRACE) + return ("TK_LBRACE"); + if (node->type == TK_ASSIGNEMENT_WORD) + return ("ASSIGNEMENT_WORD"); + if (node->type == SUBSHELL) + return ("SUBSHELL"); + if (node->type == TK_NAME) + return ("TK_NAME"); + if (node->type == TK_FOR) + return ("TK_FOR"); + if (node->type == TK_CASE) + return ("TK_CASE"); + else if (node->type == TK_PAREN_OPEN) + return ("TK_OPE"); + else if (node->type == TK_PAREN_CLOSE) + return ("TK_CLO"); + else if (node->type == TK_IN) + return ("TK_IN"); + else if (node->type ==TK_ESAC) + return ("TK_ESAC"); + else if (node->type == TK_THEN) + return ("THEN"); + else if (node->type == TK_FI) + return ("FI"); + else if (node->type == TK_DO) + return ("TK_DO"); + else if (node->type == TK_AMP) return (" & "); + else if (node->type == TK_WORD) + return (" TK_WORD"); else if (node->type == TK_SEMI) return (" ; "); else if (node->type == TK_AND_IF) @@ -32,6 +71,18 @@ char *ft_putast(void *nodein) return (" | "); else if (node->type == TK_COMMAND) return (" COM "); + else if (node->type == TK_WHILE) + return (" WHILE "); + else if (node->type == TK_IF) + return ("IF"); + else if (node->type == TK_ELIF) + return ("ELIF"); + else if (node->type == TK_ELSE) + return ("ELSE"); + else if (node->type == TK_UNTIL) + return ("UNTIL"); + else if (node->type == TK_NEWLINE) + return ("NEW"); else if (node->type == TK_GREAT) return (" > "); else if (node->type == TK_LESS) diff --git a/42sh/src/main/ft_putast2.c b/42sh/src/main/ft_putast2.c deleted file mode 100644 index 5947a315..00000000 --- a/42sh/src/main/ft_putast2.c +++ /dev/null @@ -1,59 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* tree_type.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */ -/* Updated: 2016/12/05 13:17:50 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -void ft_putast2(void *nodein) -{ - t_astnode *node; - - node = nodein; - if (node->type == TK_SEMI) - ft_putendl_fd("SEMI", 2); - else if (node->type == TK_PIPE) - ft_putendl_fd("PIPE", 2); - else if (node->type == TK_COMMAND) - { - ft_putstr_fd("COMMAND: ", 2); - ft_sstrprint_fd(2, node->data.sstr, ','); - ft_putchar_fd('\n', 2); - } - else if (node->type & TK_REDIR) - { - ft_putnbr_fd(node->data.redir.n, 2); - if (node->type == TK_GREATAND || node->type == TK_LESSAND) - { - if (node->type == TK_GREATAND) - ft_putstr_fd(">&:", 2); - else - ft_putstr_fd("<&:", 2); - ft_putnbr_fd(node->data.redir.word.fd, 2); - if (node->data.redir.close) - ft_putstr_fd(" (closed)", 2); - } - else - { - if (node->type == TK_GREAT) - ft_putendl_fd(">:", 2); - else if (node->type == TK_LESS) - ft_putstr_fd("<:", 2); - else if (node->type == TK_DGREAT) - ft_putstr_fd(">>:", 2); - else if (node->type == TK_DLESS) - ft_putstr_fd("<<:", 2); - ft_putstr_fd(node->data.redir.word.word, 2); - } - ft_putchar_fd('\n', 2); - } - else - ft_putendl_fd("OTHER", 2); -} diff --git a/42sh/src/main/instruction_free.c b/42sh/src/main/instruction_free.c new file mode 100644 index 00000000..a1b27fa2 --- /dev/null +++ b/42sh/src/main/instruction_free.c @@ -0,0 +1,10 @@ +#include "minishell.h" + +int instruction_free(t_list **token, t_parser *parser, t_btree **ast) +{ + ft_lstdel(token, &token_free); + token = NULL; + ft_lstdel(&parser->stack, NULL); + btree_del(ast, &ast_free); + return (0); +} diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 61980e43..224b71ef 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,94 +6,128 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/03/07 17:28:34 by gwojda ### ########.fr */ +/* Updated: 2017/03/08 23:42:24 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int non_interactive_shell(char *command) +int handle_instruction(int fd) { - t_list *token; - t_lexer lexer; - t_btree *ast; + t_list *token; + t_list *ltoken; + t_lexer lexer; + t_parser parser; + t_btree *ast; + char *str; + int ret; lexer_init(&lexer); - lexer.str = command; + parser_init(&parser); token = NULL; ast = NULL; - while (lexer.str[lexer.pos]) + while (1) { - if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH) - pop(&lexer.stack); - do { - lexer_lex(&token, &lexer); - } while (lexer.str[lexer.pos] == '\n'); - if (!token) - return (0); -// if (bquotes_expand(&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; - t_list *token_tail; - t_lexer lexer; - t_btree *ast; - - lexer_init(&lexer); - token = NULL; - ast = NULL; - do { - char *str = readline(stack_to_prompt(lexer.stack)); + if ((ret = readline(fd, get_lexer_stack(lexer) || + parser.state == UNDEFINED || lexer.state == HEREDOC, &str))) + { + if (ret == -1) + return (-1); + return (parser.state == UNDEFINED ? error_EOF(&token, + &parser, &ast) : 1); + } ft_strappend(&lexer.str, str); if (get_lexer_stack(lexer) == BACKSLASH) pop(&lexer.stack); - else if (get_lexer_stack(lexer) == DLESS) - lexer.state = DLESS; - token_tail = ft_lstlast(token); - /* if (token_tail) */ - /* token_tail = token_tail->next; */ - if (lexer_lex(token ? &token_tail : &token, &lexer)) + /* else if (get_lexer_stack(lexer) == DLESS) */ + /* lexer.state = DLESS; */ + ltoken = ft_lstlast(token); + if (lexer_lex(token ? <oken : &token, &lexer)) + return (1); + if (get_lexer_stack(lexer) > 2) + continue ; + lexer.state = DEFAULT; + if (get_reserved_words(&token)) return (1); token_print(token); - } while (get_lexer_stack(lexer)); - if (!token) - return (0); - ft_add_str_in_history(lexer.str); - if (ft_parse(&ast, &token)) - return (1); - btree_print(STDBUG, ast, &ft_putast); + if (insert_newline(&token)) + return (1); + if (ft_parse(&ast, &token, &parser)) + continue ; + DG(); + lexer.state = (data_singleton()->heredoc_queue) ? HEREDOC : 0; + if (data_singleton()->heredoc_queue) + DG("still in HEREDOC"); + if (lexer.state) + continue; + else if (parser.state == SUCCESS) + break ; + else if (parser.state == ERROR && SH_IS_INTERACTIVE(data_singleton()->opts)) + { + ft_add_str_in_history(lexer.str); + return (error_syntax(&token, &parser, &ast)); + } + else if (parser.state == ERROR) + error_syntax(&token, &parser, &ast); + } + DG("Before execution:"); +// btree_print(STDBUG, ast, &ft_putast); if (ft_exec(&ast)) return (1); - ft_strdel(&lexer.str); + instruction_free(&token, &parser, &ast); + ft_add_str_in_history(lexer.str); return (0); } +int get_input_fd() +{ + t_data *data; + char *file; + int fds[2]; + int fd; + + data = data_singleton(); + if (SH_IS_INTERACTIVE(data->opts)) + return (fd); + else if (data->opts & SH_OPTS_LC) + { + pipe(fds); + fd = fds[PIPE_READ]; + file = shell_get_avdata(); + write(fds[PIPE_WRITE], file, ft_strlen(file)); + close(fds[PIPE_WRITE]); + fcntl(fd, F_SETFD, FD_CLOEXEC); + return (fd); + } + else if ((file = shell_get_avdata())) + { + if ((fd = open(file, O_RDONLY | O_CLOEXEC)) < 0) + return (-1); + return (fd); + } + else + return (STDIN); +} + int main(int ac, char **av) { - t_data *data; + int fd; - data = data_singleton(); - DG();DG(); setlocale(LC_ALL, ""); shell_init(ac, av); -// DG("{inv}{bol}{gre}start of shell{eoc} JOBC is %s", SH_HAS_JOBC(data->opts)?"ON":"OFF"); - if (SH_IS_INTERACTIVE(data->opts)) + if ((fd = get_input_fd()) < 0) { - while (1) - interactive_shell(); + ft_printf("{red}%s: %s: No such file or directory\n{eoc}", SHELL_NAME, shell_get_avdata()); + return (1); } - else - non_interactive_shell(shell_get_avdata()); -// builtin_exit(0); + DG("{inv}{bol}{gre}start of shell{eoc} JOBC is %s, fd=[%i]", + SH_HAS_JOBC(data_singleton()->opts)?"ON":"OFF", fd); + while (handle_instruction(fd) == 0) + { +// lexer_clean; +// parser_clean; + ; + } + builtin_exit(NULL, NULL, NULL); return (0); } diff --git a/42sh/src/main/shell_get_avdata.c b/42sh/src/main/shell_get_avdata.c index eecb524c..16a34d13 100644 --- a/42sh/src/main/shell_get_avdata.c +++ b/42sh/src/main/shell_get_avdata.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/11 17:14:52 by jhalford #+# #+# */ -/* Updated: 2017/01/11 17:26:32 by jhalford ### ########.fr */ +/* Updated: 2017/03/03 17:33:33 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ char *shell_get_avdata() data = data_singleton(); av = data->argv; i = 1; - while (av[i][0] == '-') + while (av[i] && av[i][0] == '-') { if (ft_strcmp(av[i], "--") == 0) { diff --git a/42sh/src/main/shell_get_opts.c b/42sh/src/main/shell_get_opts.c index 86ce3c8e..dc75dddd 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/02/09 20:50:08 by jhalford ### ########.fr */ +/* Updated: 2017/03/06 16:52:34 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,8 +40,11 @@ void shell_get_opts(int ac, char **av) int i; i = 1; - if (isatty(STDIN)) + if (isatty(STDIN) && !av[1]) + { data_singleton()->opts |= SH_INTERACTIVE; + data_singleton()->opts |= SH_OPTS_JOBC; + } while (i < ac && av[i][0] == '-') { if (ft_strcmp(av[i], "--") == 0) diff --git a/42sh/src/main/shell_init.c b/42sh/src/main/shell_init.c index b6f2f19a..3a8ad244 100644 --- a/42sh/src/main/shell_init.c +++ b/42sh/src/main/shell_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 17:23:59 by jhalford #+# #+# */ -/* Updated: 2017/03/07 15:23:44 by jhalford ### ########.fr */ +/* Updated: 2017/03/08 23:42:47 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/add_case.c b/42sh/src/parser/add_case.c new file mode 100644 index 00000000..bd228540 --- /dev/null +++ b/42sh/src/parser/add_case.c @@ -0,0 +1,106 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_case.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/04 20:42:13 by ariard #+# #+# */ +/* Updated: 2017/03/07 22:46:00 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int iscase(t_btree **ast, t_list **lst) +{ + t_astnode *node; + + (void)lst; + node = NULL; + if (*ast) + { + node = (*ast)->item; + if (node->type == TK_CASE || node->type == TK_PAREN_OPEN) + return (1); + } + return (0); +} + +int iscase_pattern(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + +// DG(" add pattern"); + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if ((node->type == TK_CASE || node->type == TK_PAREN_OPEN) + && token->type == TK_WORD && node->pattern == 0) + return (1); + } + return (0); +} + +int iscase_branch(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if ((node->type == TK_PAREN_OPEN || node->type == TK_CASE) + && node->nest == 0 && token->type == TK_PAREN_OPEN) + return (1); + } + return (0); +} + +int add_case_cmd(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + token = (*lst)->content; + node = (*ast)->item; + if (token->type == TK_CASE && (node->type == TK_PAREN_OPEN + || node->type == TK_CASE)) + node->nest++; + if (token->type == TK_ESAC && (node->type == TK_PAREN_OPEN + || node->type == TK_CASE) && node->nest > 0) + return ((node->nest--)); + else if (token->type == TK_DSEMI && node->type == TK_PAREN_OPEN + && node->nest == 0) + return ((node->full = 1)); + else if ((token->type == TK_ESAC || token->type == TK_PAREN_CLOSE) + && node->nest == 0) + return (0); + return (add_cmd(&(*ast)->right, lst)); +} + +int add_pattern(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + char **my_tab; + + DG("add pattern"); + token = (*lst)->content; + node = (*ast)->item; + if ((my_tab = (char **)malloc(sizeof(char *) * 4))) + { + my_tab[0] = ft_strdup(token->data); + my_tab[1] = (char *)dup_char_esc(token->esc, token->size >> 3); + my_tab[2] = (char *)dup_char_esc(token->esc2, token->size >> 3); + my_tab[3] = NULL; + } + ft_ld_pushback(&node->data.cmd.wordlist, my_tab); + node->pattern = 1; + return (0); +} diff --git a/42sh/src/parser/add_cmd.c b/42sh/src/parser/add_cmd.c new file mode 100644 index 00000000..f7c8f491 --- /dev/null +++ b/42sh/src/parser/add_cmd.c @@ -0,0 +1,94 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_cmd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/15 20:49:15 by ariard #+# #+# */ +/* Updated: 2017/03/08 16:19:23 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_distrostree g_distrostree[] = +{ + {&superflous_token, &add_null}, + {&isdir_sep, &add_redir_type}, + {&isdir_word, &add_redir_word}, + {&isvar, &add_var}, + {&isloop_condition, &add_loop_condition}, + {&isloop, &add_loop_cmd}, + {&iscondition_branch, &add_branch}, + {&iscondition, &add_condition_cmd}, + {&iscase_pattern, &add_pattern}, + {&iscase_branch, &add_branch}, + {&iscase, &add_case_cmd}, + {&ismath, &add_null}, + {&ismath_expr, &add_pattern}, + {&issubshell, &add_subshell_cmd}, + {&isfunc_name, &add_null}, + {&isfunc, &add_func_cmd}, + {&isionumber, &add_ionumber}, + {&isnull, &add_null}, +}; + +int superflous_token(t_btree **ast, t_list **lst) +{ + t_token *token; + + (void)ast; + if (*lst) + { + token = (*lst)->content; + if (token->type == TK_IN || token->type == TK_DSEMI) + return (1); + } + return (0); +} + +static int no_del_token(t_btree **ast, t_list **lst) +{ + t_astnode *node; + + (void)lst; + node = NULL; + if (*ast) + { + node = (*ast)->item; + if (node->type != TK_DO && node->type != TK_THEN + && node->type != CMD && node->type != REDIR) + return (1); + } + return (0); +} + +int add_cmd(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + int i; + + i = -1; + while (++i < 14) + if (g_distrostree[i].test(ast, lst) == 1) + { + DG("add : %d", i); + return (g_distrostree[i].add(ast, lst)); + } + if (!*ast) + gen_node(ast); + else if (no_del_token(ast, lst)) + return (add_cmd(&(*ast)->right, lst)); + token = (*lst)->content; + node = (*ast)->item; + if (token->type != TK_WORD) + node->type = token->type; + else + node->type = CMD; + if (token->type == TK_WORD || token->type == TK_ASSIGNEMENT_WORD) + ft_ld_pushback(&node->data.cmd.token, + gen_tab(token->data, token->esc, token->esc2, 1)); + return (0); +} diff --git a/42sh/src/parser/add_condition.c b/42sh/src/parser/add_condition.c new file mode 100644 index 00000000..c563cbb1 --- /dev/null +++ b/42sh/src/parser/add_condition.c @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_condition.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/19 18:12:52 by ariard #+# #+# */ +/* Updated: 2017/03/07 22:46:10 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int iscondition(t_btree **ast, t_list **lst) +{ + t_astnode *node; + + (void)lst; + node = NULL; + if (*ast) + { + node = (*ast)->item; + if ((node->type == TK_IF || node->type == TK_ELIF || node->type == TK_ELSE) + && node->full == 0) + return (1); + if ((node->type == TK_NEWLINE || node->type == TK_SEMI + || node->type == TK_AMP) && iscondition(&(*ast)->right, lst)) + return (1); + } + return (0); +} + +int iscondition_branch(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if ((node->type == TK_IF || iscondition(&(*ast)->right, lst)) + && (token->type == TK_ELIF || token->type == TK_ELSE) + && node->nest == 0) + return (1); + } + return (0); +} + +int add_condition_cmd(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + + DG("add condition"); + token = (*lst)->content; + node = (*ast)->item; + if (token->type == TK_IF && (node->type == TK_IF || node->type == TK_ELIF + || node->type == TK_ELSE)) + node->nest++; + if (token->type == TK_FI && (node->type == TK_IF || node->type == TK_ELIF + || node->type == TK_ELSE) && node->nest > 0) + node->nest--; + else if (token->type == TK_FI && (node->type == TK_IF || node->type == TK_ELIF + || node->type == TK_ELSE)) + return ((node->full = 1)); + if (token->type == TK_THEN) + return (add_cmd(&(*ast)->right, lst)); + else if (!(*ast)->right) + return (add_cmd(&(*ast)->left, lst)); + else + return (add_cmd(&(*ast)->right, lst)); + return (0); +} + +int add_condition_sep(t_btree **ast, t_list **lst) +{ + if (!(*ast)->right) + return (add_sep(&(*ast)->left, lst)); + else + return (add_sep(&(*ast)->right, lst)); + return (0); +} + +int add_branch(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_btree *new_node; + + new_node = NULL; + gen_node(&new_node); + join_ast(ast, &new_node); + node = (new_node)->item; + node->type = TK_NEWLINE; + return (add_cmd(ast, lst)); +} diff --git a/42sh/src/parser/add_func.c b/42sh/src/parser/add_func.c new file mode 100644 index 00000000..e417bcbf --- /dev/null +++ b/42sh/src/parser/add_func.c @@ -0,0 +1,96 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_func.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/24 23:43:07 by ariard #+# #+# */ +/* Updated: 2017/03/08 03:21:13 by wescande ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int isfunc_name(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type == CMD && token->type == TK_PAREN_OPEN) + { + DG("add func name"); + node->type = FNAME; + node->data.str = ft_strdup(token->data); + return (1); + } + if (node->type == FNAME && token->type == TK_PAREN_CLOSE && node->nest == 0) + return (1); + } + return (0); +} + +int isfunc(t_btree **ast, t_list **lst) +{ + t_astnode *node; + + (void)lst; + node = NULL; + if (*ast) + { + node = (*ast)->item; + if ((node->type == TK_NEWLINE || node->type == TK_SEMI + || node->type == TK_AMP) && isfunc(&(*ast)->right, lst) == 1) + return (1); + if (node->type == FNAME && node->full == 0) + return (1); + } + return (0); +} + +int add_func_cmd(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + DG("add func cmd"); + token = (*lst)->content; + node = (*ast)->item; + if ((token->type == TK_CASE || token->type == TK_WHILE || token->type == TK_IF + || token->type == TK_UNTIL || token->type == TK_FOR + || token->type == SUBSHELL || token->type == TK_LBRACE) + && node->type == FNAME) + node->nest++; + if ((token->type == TK_DONE || token->type == TK_ESAC || token->type == TK_FI + || token->type == TK_RBRACE || token->type == TK_PAREN_CLOSE) + && node->type == FNAME && node->nest > 0) + node->nest--; + if ((token->type == TK_DONE || token->type == TK_ESAC || token->type == TK_FI + || token->type == TK_RBRACE || token->type == TK_PAREN_CLOSE) + && node->type == FNAME && node->nest == 0) + { + node->full = 1; + add_one_func(ast, lst); + } + return (add_cmd(&(*ast)->right, lst)); +} + +int add_func_sep(t_btree **ast, t_list **lst) +{ + return (add_sep(&(*ast)->right, lst)); +} + +int add_one_func(t_btree **ast, t_list **lst) +{ + t_btree *func_ast; + + (void)lst; + func_ast = btree_map(*ast, node_copy); + ft_lsteadd(&data_singleton()->lst_func, ft_lstnew(&func_ast, sizeof(*ast))); + DG("arbre ajoute"); + return (0); +} diff --git a/42sh/src/parser/add_loop.c b/42sh/src/parser/add_loop.c new file mode 100644 index 00000000..f7a6999e --- /dev/null +++ b/42sh/src/parser/add_loop.c @@ -0,0 +1,106 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_loop.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/17 22:17:14 by ariard #+# #+# */ +/* Updated: 2017/03/07 22:46:20 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int isloop(t_btree **ast, t_list **lst) +{ + t_astnode *node; + + (void)lst; + node = NULL; + if (*ast) + { + node = (*ast)->item; + if ((node->type == TK_NEWLINE || node->type == TK_SEMI + || node->type == TK_AMP) && isloop(&(*ast)->right, lst) == 1) + return (1); + if ((node->type == TK_WHILE || node->type == TK_UNTIL + || node->type == TK_FOR) && node->full == 0) + return (1); + } + return (0); +} + +int isloop_condition(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type == TK_FOR && (token->type == TK_WORD || token->type == TK_NAME) + && node->pattern == 0) + return (1); + } + return (0); +} + +int add_loop_cmd(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + + token = (*lst)->content; + node = (*ast)->item; + DG("add loop cmd"); + if (token->type == TK_DO && node->type == TK_FOR) + node->pattern = 1; + if ((token->type == TK_WHILE || token->type == TK_UNTIL || token->type == TK_FOR) + && (node->type == TK_WHILE || node->type == TK_UNTIL || node->type == TK_FOR)) + node->nest++; + if (token->type == TK_DONE && (node->type == TK_WHILE + || node->type == TK_UNTIL || node->type == TK_FOR) && node->nest > 0) + node->nest--; + else if (token->type == TK_DONE && (node->type == TK_WHILE + || node->type == TK_UNTIL || node->type == TK_FOR) && node->nest == 0) + return ((node->full = 1)); + if (token->type == TK_DO && node->nest == 0) + return (add_cmd(&(*ast)->right, lst)); + else if (!(*ast)->right && isloop(&(*ast)->left, lst) != 2) + return (add_cmd(&(*ast)->left, lst)); + else + return (add_cmd(&(*ast)->right, lst)); + return (0); +} + +int add_loop_sep(t_btree **ast, t_list **lst) +{ + if (!(*ast)->right) + return (add_sep(&(*ast)->left, lst)); + else + return (add_sep(&(*ast)->right, lst)); + return (0); +} + +int add_loop_condition(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + char **my_tab; + + token = (*lst)->content; + node = (*ast)->item; + DG("add word"); + if ((my_tab = (char **)malloc(sizeof(char *) * 4))) + { + my_tab[0] = ft_strdup(token->data); + my_tab[1] = (char *)dup_char_esc(token->esc, token->size >> 3); + my_tab[2] = (char *)dup_char_esc(token->esc2, token->size >> 3); + my_tab[3] = NULL; + } + ft_ld_pushback(&node->data.cmd.wordlist, my_tab); + return (0); +} diff --git a/42sh/src/parser/add_math.c b/42sh/src/parser/add_math.c new file mode 100644 index 00000000..a309a957 --- /dev/null +++ b/42sh/src/parser/add_math.c @@ -0,0 +1,39 @@ +#include "minishell.h" + +int ismath(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type == SUBSHELL && token->type == SUBSHELL) + { + node->type = MATH; + return (1); + } + if (node->type == MATH && token->type == TK_PAREN_CLOSE) + return (1); + } + return (0); +} + + +int ismath_expr(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type == MATH && token->type == TK_WORD) + return (1); + } + return (0); +} diff --git a/42sh/src/parser/add_number.c b/42sh/src/parser/add_number.c new file mode 100644 index 00000000..67873692 --- /dev/null +++ b/42sh/src/parser/add_number.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_number.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/05 17:28:31 by ariard #+# #+# */ +/* Updated: 2017/03/06 15:56:00 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int isionumber(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type == CMD && token->type == TK_IO_NUMBER) + return (1); + } + if (!*ast) + { + if (token->type == TK_IO_NUMBER) + return (1); + } + return (0); +} + +int add_ionumber(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + t_redir redir; + + DG("add io_number"); + if (!*ast) + gen_node(ast); + token = (*lst)->content; + node = (*ast)->item; + node->type = token->type; + redir.n = ft_atoi(token->data); + ft_lsteadd(&node->data.cmd.redir, ft_lstnew(&redir, sizeof(redir))); + return (0); +} diff --git a/42sh/src/parser/add_redir.c b/42sh/src/parser/add_redir.c new file mode 100644 index 00000000..b4747ba2 --- /dev/null +++ b/42sh/src/parser/add_redir.c @@ -0,0 +1,116 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_file.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/17 16:39:05 by ariard #+# #+# */ +/* Updated: 2017/03/08 22:11:07 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int isdir_sep(t_btree **ast, t_list **list) +{ + t_token *token; + t_astnode *node; + + token = (*list)->content; + if (*ast) + { + node = (*ast)->item; + if ((node->type == CMD || node->type == TK_IO_NUMBER) && + (token->type == TK_LESS || token->type == TK_GREAT + || token->type == TK_GREATAND || token->type == TK_LESSAND + || token->type == TK_DLESS || token->type == TK_DGREAT)) + return (1); + } + if (!*ast) + { + if (token->type == TK_LESS || token->type == TK_GREAT + || token->type == TK_GREATAND || token->type == TK_LESSAND + || token->type == TK_DLESS || token->type == TK_DGREAT) + return (1); + } + return (0); +} + +int isdir_word(t_btree **ast, t_list **list) +{ + t_astnode *node; + t_token *token; + + token = (*list)->content; + if (*ast) + { + node = (*ast)->item; + if (token->type == TK_WORD && node->type == REDIR) + { + node->type = CMD; + return (1); + } + } + return (0); +} + +int add_redir_word(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + t_redir *redir; + t_redir *temp; + + token = (*lst)->content; + node = (*ast)->item; + if (node->data.cmd.redir) + { + DG("add file"); + redir = (ft_lstlast(node->data.cmd.redir))->content; + DG("now redir.type :%s", read_state(redir->type)); + redir->word = ft_strdup(token->data); + if (redir->type == TK_DLESS) + { + temp = ft_lstlast((data_singleton()->heredoc_queue))->content; + temp->word = redir->word; + } + } + return (0); +} + +int add_redir_type(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + t_redir redir; + t_redir *temp; + t_redir *temp_heredoc; + + if (!*ast) + gen_node(ast); + token = (*lst)->content; + node = (*ast)->item; + if (!(node->type == TK_IO_NUMBER)) + { + redir.n = (token->type == TK_LESS || token->type == TK_DLESS + || token->type == TK_LESSAND) ? STDIN : STDOUT; + redir.type = token->type; + redir.heredoc_data = NULL; + ft_lsteadd(&node->data.cmd.redir, ft_lstnew(&redir, sizeof(redir))); + if (token->type == TK_DLESS) + ft_lsteadd(&data_singleton()->heredoc_queue, ft_lstnew(&redir, sizeof(redir))); + } + else + { + temp = (ft_lstlast(node->data.cmd.redir))->content; + temp->type = token->type; + if (token->type == TK_DLESS) + { + temp_heredoc = data_singleton()->heredoc_queue->content; + temp_heredoc->n = temp->n; + } + } + node->type = REDIR; + return (0); +} diff --git a/42sh/src/parser/add_sep.c b/42sh/src/parser/add_sep.c new file mode 100644 index 00000000..0a3a2a22 --- /dev/null +++ b/42sh/src/parser/add_sep.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_sep.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/15 19:12:07 by ariard #+# #+# */ +/* Updated: 2017/03/07 22:46:57 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int add_sep(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + t_btree *new_node; + + DG("add sep"); + if (isloop(ast, lst)) + return (add_loop_sep(ast, lst)); + else if (iscondition(ast, lst)) + return (add_condition_sep(ast, lst)); + else if (iscase(ast, lst)) + return (add_sep(&(*ast)->right, lst)); + else if (issubshell(ast, lst)) + return (add_subshell_sep(ast, lst)); + else if (isfunc(ast, lst)) + return (add_func_sep(ast, lst)); + if (!*ast) + gen_node(ast); + token = (*lst)->content; +//watch != TK_DO + new_node = NULL; + gen_node(&new_node); + join_ast(ast, &new_node); + node = (new_node)->item; + node->type = token->type; + return (0); +} diff --git a/42sh/src/parser/add_subshell.c b/42sh/src/parser/add_subshell.c new file mode 100644 index 00000000..88f25c43 --- /dev/null +++ b/42sh/src/parser/add_subshell.c @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_subshell.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/24 18:41:50 by ariard #+# #+# */ +/* Updated: 2017/03/07 22:46:36 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int issubshell(t_btree **ast, t_list **lst) +{ + t_astnode *node; + + (void)lst; + node = NULL; + if (*ast) + { + node = (*ast)->item; + if (node->type == SUBSHELL && node->full == 0) + return (1); + } + return (0); +} + +int add_subshell_cmd(t_btree **ast, t_list **lst) +{ + t_token *token; + t_astnode *node; + + DG("add subshell"); + token = (*lst)->content; + node = (*ast)->item; + if (token->type == TK_PAREN_CLOSE && node->type == SUBSHELL) + return ((node->full = 1)); + if (token->type == TK_RBRACE && node->type == TK_LBRACE) + return ((node->full = 1)); + return (add_cmd(&(*ast)->right, lst)); +} + +int add_subshell_sep(t_btree **ast, t_list **lst) +{ + return (add_sep(&(*ast)->right, lst)); +} diff --git a/42sh/src/parser/add_var.c b/42sh/src/parser/add_var.c new file mode 100644 index 00000000..fe17bb85 --- /dev/null +++ b/42sh/src/parser/add_var.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* add_var.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/03 15:08:16 by ariard #+# #+# */ +/* Updated: 2017/03/07 22:47:38 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int isvar(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_token *token; + + node = NULL; + token = (*lst)->content; + if (*ast) + { + node = (*ast)->item; + if (node->type != TK_ASSIGNEMENT_WORD && token->type == TK_ASSIGNEMENT_WORD) + return (1); + } + return (0); +} + +int add_var(t_btree **ast, t_list **lst) +{ + t_astnode *node; + t_btree *new_node; + + if (!*ast) + return (0); + new_node = NULL; + gen_node(&new_node); + join_ast(ast, &new_node); + node = (new_node)->item; + node->type = TK_SEMI; + add_cmd(&new_node, lst); + return (0); +} diff --git a/42sh/src/parser/aggregate_sym.c b/42sh/src/parser/aggregate_sym.c new file mode 100644 index 00000000..a91f6a8c --- /dev/null +++ b/42sh/src/parser/aggregate_sym.c @@ -0,0 +1,366 @@ +/* ************************************************************************** */ /* */ +/* ::: :::::::: */ +/* aggregate_sym.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 17:39:18 by ariard #+# #+# */ +/* Updated: 2017/03/04 16:16:23 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_aggrematch g_aggrematch[] = +{ + {TK_WORD, CMD_SUFFIX, CMD_SUFFIX, 0}, + {TK_WORD, TK_PIPE, PATTERN, 0}, + {TK_WORD, TK_IN, FOR_WORDLIST, TK_IN}, + {TK_WORD, FOR_WORDLIST, FOR_WORDLIST, FOR_WORDLIST}, + {TK_WORD, MATH, MATH, MATH}, + {TK_SEMI, FOR_WORDLIST, SEQUENTIAL_SEP, 0}, + {TK_DSEMI, CMD_SUPERIOR, PIPE_SEQUENCE, CMD_SUPERIOR}, + {TK_DSEMI, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {TK_PAREN_OPEN, TK_IN, PATTERN_CASE, 0}, + {TK_PAREN_OPEN, CASE_LIST_NS, PATTERN_CASE, 0}, + {TK_PAREN_OPEN, CMD_SUPERIOR, FUNC_NAME, CMD_SUPERIOR}, + {TK_PAREN_OPEN, TK_PAREN_OPEN, MATH, TK_PAREN_OPEN}, + {TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0}, + {TK_PIPE, CMD_SUPERIOR, SEQUENCE, CMD_SUPERIOR}, + {TK_PIPE, PIPE_SEMI_SEQUENCE, SEQUENCE, PIPE_SEMI_SEQUENCE}, +// {TK_PIPE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {TK_FI, ELSE_PART, IF_CLAUSE, TK_IF}, + {TK_FI, COMPOUND_LIST, IF_CLAUSE, COMPLETE_CONDITION}, + {TK_FI, COMPLETE_CONDITION, IF_CLAUSE, COMPLETE_CONDITION}, + {TK_FI, CONDITION, IF_CLAUSE, COMPLETE_CONDITION}, + {TK_THEN, CONDITION, COMPLETE_CONDITION, CONDITION}, + {TK_DONE, CMD_SUPERIOR, DO_GROUP, TK_DO}, + {TK_DONE, COMPOUND_LIST, DO_GROUP, TK_DO}, +//Esac ? + {TK_ESAC, TK_IN, CASE_CLAUSE, TK_CASE}, + {TK_ESAC, CASE_LIST_NS, CASE_CLAUSE, TK_CASE}, + {TK_RBRACE, COMPOUND_LIST, BRACE_GROUP, TK_LBRACE}, + {TK_PAREN_CLOSE, MATH, MATH_PLUS, MATH}, + {TK_PAREN_CLOSE, MATH_PLUS, MATH_SUP, MATH_PLUS}, + {TK_PAREN_CLOSE, COMPOUND_LIST, SUBSHELL, TK_PAREN_OPEN}, + {TK_PAREN_CLOSE, CMD_SUPERIOR, SUBSHELL, TK_PAREN_OPEN}, + {TK_PAREN_CLOSE, PIPE_SEMI_SEQUENCE, SUBSHELL, TK_PAREN_OPEN}, + {TK_RBRACE, COMPOUND_LIST, BRACE_CLAUSE, TK_LBRACE}, + {TK_RBRACE, CMD_SUPERIOR, BRACE_CLAUSE, TK_LBRACE}, + {TK_RBRACE, PIPE_SEMI_SEQUENCE, BRACE_CLAUSE, TK_LBRACE}, + + {TK_RBRACE, COMPOUND_LIST, BRACE_CLAUSE, TK_LBRACE}, + {TK_RBRACE, CMD_SUPERIOR, BRACE_CLAUSE, TK_LBRACE}, + {TK_RBRACE, PIPE_SEMI_SEQUENCE, BRACE_CLAUSE, TK_LBRACE}, + {TK_AND_IF, CMD_SUPERIOR, AND_OR_MINOR, CMD_SUPERIOR}, + {TK_OR_IF, CMD_SUPERIOR, AND_OR_MINOR, CMD_SUPERIOR}, +//watch this + {SEPARATOR_OP, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, + {SEPARATOR_OP, CMD_SUPERIOR, SEPARATOR, 0}, + {SEPARATOR_OP, COMPOUND_LIST, SEPARATOR, 0}, + {SEPARATOR_OP, CASE_LIST_NS, SEPARATOR, 0}, + {SEPARATOR_OP, PIPE_SEMI_SEQUENCE, SEPARATOR, 0}, + {SEPARATOR, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, + {SEPARATOR, CMD_SUPERIOR, END_COMMAND, CMD_SUPERIOR}, + {SEPARATOR, CASE_LIST_NS, CASE_LIST_NS, CASE_LIST_NS}, + {SEPARATOR, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, + {SEPARATOR, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {LINEBREAK, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, + {LINEBREAK, SEPARATOR_OP, SEPARATOR, SEPARATOR_OP}, + {LINEBREAK, TK_SEMI, SEQUENTIAL_SEP, TK_SEMI}, + +//to abstract TK_ESAC + {LINEBREAK, TK_PAREN_CLOSE, FUNC, FNAME}, + {LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK}, + {LINEBREAK, CMD_SUPERIOR, SEPARATOR_OP, 0}, + {LINEBREAK, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, + {LINEBREAK, CASE_LIST_NS, CASE_LIST_NS, CASE_LIST_NS}, + {NEWLINE_LIST, MATH_SUP, CMD_SUPERIOR, MATH_SUP}, + {NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME}, + {NEWLINE_LIST, SEQUENTIAL_SEP, SEQUENTIAL_SEP, SEQUENTIAL_SEP}, + {NEWLINE_LIST, TK_DO, TK_DO, TK_DO}, + {NEWLINE_LIST, TK_PAREN_CLOSE, TK_PAREN_CLOSE, TK_PAREN_CLOSE}, + {NEWLINE_LIST, TK_PAREN_OPEN, TK_PAREN_OPEN, TK_PAREN_OPEN}, + {NEWLINE_LIST, TK_RBRACE, TK_RBRACE, TK_RBRACE}, + {NEWLINE_LIST, TK_LBRACE, TK_LBRACE, TK_LBRACE}, + {NEWLINE_LIST, TK_IN, TK_IN, TK_IN}, + {NEWLINE_LIST, TK_THEN, TK_THEN, TK_THEN}, + {NEWLINE_LIST, TK_IF, TK_IF, TK_IF}, + {NEWLINE_LIST, TK_ELIF, TK_ELIF, TK_ELIF}, + {NEWLINE_LIST, TK_ELSE, TK_ELSE, TK_ELSE}, + {NEWLINE_LIST, TK_WHILE, TK_WHILE, TK_WHILE}, + {NEWLINE_LIST, TK_UNTIL, TK_UNTIL, TK_UNTIL}, + {NEWLINE_LIST, CASE_LIST_NS, CASE_LIST_NS, CASE_LIST_NS}, + {NEWLINE_LIST, NEWLINE_LIST, NEWLINE_LIST, NEWLINE}, + {NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0}, + {NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0}, + {NEWLINE_LIST, TERM, SEPARATOR, 0}, + {NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0}, + {NEWLINE_LIST, CASE_LIST_NS, SEPARATOR, 0}, + {NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION}, + {NEWLINE_LIST, CONDITION, CONDITION, CONDITION}, + {NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0}, + {NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK}, + {NEWLINE_LIST, FOR_WORDLIST, SEQUENTIAL_SEP, 0}, + {NEWLINE_LIST, PROGRAM, PROGRAM, PROGRAM}, + {SEQUENTIAL_SEP, FOR_WORDLIST, SEQUENTIAL_SEP, FOR_WORDLIST}, +//to check + {FILENAME, TK_LESS, IO_FILE, TK_LESS}, + {FILENAME, TK_LESSAND, IO_FILE, TK_LESSAND}, + {FILENAME, TK_GREAT, IO_FILE, TK_GREAT}, + {FILENAME, TK_GREATAND, IO_FILE, TK_GREATAND}, + {FILENAME, TK_DGREAT, IO_FILE, TK_DGREAT}, + {FILENAME, TK_LESSGREAT, IO_FILE, TK_LESSGREAT}, + {FILENAME, TK_CLOBBER, IO_FILE, TK_CLOBBER}, + + {HERE_END, TK_DLESS, IO_HERE, TK_DLESS}, +//to check + {IO_FILE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER}, + {IO_FILE, ALL, IO_REDIRECT, 0}, + {IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER}, + {IO_HERE, ALL, IO_REDIRECT, 0}, + {IO_REDIRECT, CMD_SUPERIOR, CMD_SUPERIOR, CMD_SUPERIOR}, + {IO_REDIRECT, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {IO_REDIRECT, COMPOUND_COMMAND, REDIRECT_LIST, REDIRECT_LIST}, + +//to check + {IO_REDIRECT, CMD_SUFFIX, CMD_SUFFIX, CMD_SUFFIX}, + {IO_REDIRECT, CMD_NAME, CMD_SUFFIX, 0}, + {IO_REDIRECT, CMD_WORD, CMD_SUFFIX, 0}, + {IO_REDIRECT, CMD_PREFIX, CMD_PREFIX, CMD_PREFIX}, + {IO_REDIRECT, LINEBREAK, CMD_PREFIX, 0}, + {IO_REDIRECT, TK_PAREN_OPEN, CMD_PREFIX, 0}, + {IO_REDIRECT, TK_LBRACE, CMD_PREFIX, 0}, + {IO_REDIRECT, COMPLETE_COMMANDS, CMD_PREFIX, 0}, + {IO_REDIRECT, TK_BANG, CMD_PREFIX, 0}, + {IO_REDIRECT, SEPARATOR_OP, CMD_PREFIX, 0}, + {IO_REDIRECT, NEWLINE_LIST, CMD_PREFIX, 0}, + {REDIRECT_LIST, COMPOUND_COMMAND, COMPOUND_COMMAND, COMPOUND_COMMAND}, + {CMD_SUFFIX, CMD_WORD, SIMPLE_COMMAND, CMD_PREFIX}, + {CMD_SUFFIX, CMD_NAME, SIMPLE_COMMAND, CMD_NAME}, + {CMD_SUFFIX, CMD_SUPERIOR, CMD_SUPERIOR, CMD_SUPERIOR}, + {CMD_SUFFIX, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, +//to abstract + {CMD_PREFIX, LINEBREAK, SIMPLE_COMMAND, 0}, + {CMD_PREFIX, TK_PAREN_OPEN, SIMPLE_COMMAND, 0}, + {CMD_PREFIX, TK_LBRACE, SIMPLE_COMMAND, 0}, + {CMD_PREFIX, COMPLETE_COMMANDS, SIMPLE_COMMAND, 0}, + {CMD_PREFIX, TK_BANG, SIMPLE_COMMAND, 0}, + {CMD_PREFIX, SEPARATOR_OP, SIMPLE_COMMAND, 0}, + {CMD_PREFIX, NEWLINE_LIST, SIMPLE_COMMAND, 0}, + + {CMD_WORD, CMD_PREFIX, SIMPLE_COMMAND, CMD_PREFIX}, +//to check + {CMD_NAME, LINEBREAK, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_PAREN_OPEN, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_LBRACE, CMD_SUPERIOR, 0}, + {CMD_NAME, COMPLETE_COMMANDS, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_BANG, CMD_SUPERIOR, 0}, + {CMD_NAME, SEPARATOR_OP, CMD_SUPERIOR, 0}, + {CMD_NAME, NEWLINE_LIST, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_WHILE, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_UNTIL, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_DO, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_PAREN_CLOSE, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_IF, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_ELIF, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_ELSE, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_THEN, CMD_SUPERIOR, 0}, + {CMD_NAME, COMPOUND_LIST, CMD_SUPERIOR, 0}, + {CMD_NAME, CASE_LIST_NS, CMD_SUPERIOR, 0}, + {CMD_NAME, COMPLETE_CONDITION, CMD_SUPERIOR, 0}, + {CMD_NAME, TK_PIPE, CMD_SUPERIOR, 0}, + {CMD_NAME, SEQUENCE, CMD_SUPERIOR, 0}, +// {CMD_NAME, PIPE_SEMI_SEQUENCE, CMD_SUPERIOR, 0}, + {CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0}, + {CMD_SUPERIOR, SEQUENCE, PIPE_SEMI_SEQUENCE, SEQUENCE}, + {SIMPLE_COMMAND, ALL, COMMAND, 0}, + {DO_GROUP, NAME, FOR_CLAUSE, TK_FOR}, + {DO_GROUP, IN, FOR_CLAUSE, TK_FOR}, + {DO_GROUP, SEQUENTIAL_SEP, FOR_CLAUSE, TK_FOR}, + {DO_GROUP, CMD_SUPERIOR, LOOP, CMD_SUPERIOR}, + {DO_GROUP, COMPOUND_LIST, LOOP, COMPOUND_LIST}, + {BRACE_GROUP, ALL, COMPOUND_COMMAND, 0}, + {FUNCTION_BODY, FUNC, FUNCTION_DEFINITION, 0}, + {FUNCTION_DEFINITION, ALL, COMMAND, 0}, + {LOOP, TK_WHILE, WHILE_CLAUSE, TK_WHILE}, + {LOOP, TK_UNTIL, UNTIL_CLAUSE, TK_UNTIL}, + {UNTIL_CLAUSE, ALL, COMPOUND_COMMAND, 0}, + {WHILE_CLAUSE, ALL, COMPOUND_COMMAND, 0}, +// {ELSE_PART, COMPOUND_LIST, ELSE_PART, TK_ELIF}, +// {ELSE_PART, COMPLETE_CONDITION, IF_CLAUSE, COMPLETE_CONDITION}, + {IF_CLAUSE, ALL, COMPOUND_COMMAND, 0}, + {CASE_LIST_NS, TK_IN, TK_IN, TK_IN}, + {CASE_CLAUSE, ALL, COMPOUND_COMMAND, 0}, + {FOR_CLAUSE, ALL, COMPOUND_COMMAND, 0}, +// {COMPOUND_LIST, TK_ELSE, ELSE_PART, TK_ELSE}, + {COMPOUND_LIST, TK_IF, CONDITION, TK_IF}, + {COMPOUND_LIST, TK_THEN, CONDITION, TK_THEN}, + {COMPOUND_LIST, TK_PAREN_CLOSE, CLOSE_LIST, TK_PAREN_CLOSE}, + {COMPOUND_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION}, +// {COMPOUND_LIST, TK_THEN, ELSE_PART, TK_ELIF}, + {COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, + {COMPOUND_LIST, CASE_LIST_NS, CASE_LIST_NS, CASE_LIST_NS}, + {CLOSE_LIST, PATTERN, CASE_LIST_NS, PATTERN_CASE}, + {CLOSE_LIST, FUNC_NAME, FUNCTION_DEFINITION, FUNC_NAME}, + {SUBSHELL, ALL, COMPOUND_COMMAND, 0}, + {BRACE_CLAUSE, ALL, COMPOUND_COMMAND, 0}, + {COMPOUND_COMMAND, ALL, COMMAND, 0}, + {AND_OR_MINOR, PIPE_SEMI_SEQUENCE, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE}, + {AND_OR_MINOR, LINEBREAK, AND_OR_MAJOR, 0}, + {AND_OR_MINOR, TK_PAREN_OPEN, AND_OR_MAJOR, 0}, + {AND_OR_MINOR, TK_LBRACE, AND_OR_MAJOR, 0}, + {AND_OR_MINOR, COMPLETE_COMMANDS, AND_OR_MAJOR, 0}, + {AND_OR_MINOR, AND_OR_MAJOR, AND_OR_MAJOR, 0}, + {AND_OR_MINOR, TK_BANG, AND_OR_MAJOR, 0}, + {COMMAND, SEQUENCE, PIPE_SEMI_SEQUENCE, 0}, +// {COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, +// watch + {COMMAND, COMPOUND_LIST, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, CASE_LIST_NS, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_WHILE, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_UNTIL, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_DO, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_PAREN_CLOSE, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_IF, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_THEN, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_ELIF, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_ELSE, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_BANG, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, SEPARATOR_OP, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, NEWLINE_LIST, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, LINEBREAK, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_BANG, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_PAREN_OPEN, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, TK_LBRACE, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, COMPLETE_COMMANDS, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, AND_OR_MAJOR, PIPE_SEMI_SEQUENCE, 0}, + {COMMAND, COMPLETE_CONDITION, PIPE_SEMI_SEQUENCE, 0}, + {END_COMMAND, SEQUENCE, PIPE_SEQUENCE, SEQUENCE}, + {END_COMMAND, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {END_COMMAND, AND_OR_MAJOR, LIST, AND_OR_MAJOR}, + {END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_WHILE, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_UNTIL, PIPE_SEQUENCE, 0}, + {END_COMMAND, LINEBREAK, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_BANG, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_PAREN_OPEN, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_LBRACE, PIPE_SEQUENCE, 0}, + {END_COMMAND, COMPLETE_COMMANDS, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_DO, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_PAREN_CLOSE, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_IF, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_ELIF, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_THEN, PIPE_SEQUENCE, 0}, + {END_COMMAND, TK_ELSE, PIPE_SEQUENCE, 0}, + {END_COMMAND, COMPLETE_CONDITION, PIPE_SEQUENCE, 0}, + {END_COMMAND, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST}, + {END_COMMAND, CASE_LIST_NS, CASE_LIST_NS, CASE_LIST_NS}, + {PIPE_SEMI_SEQUENCE, SEQUENCE, PIPE_SEMI_SEQUENCE, PIPE_SEMI_SEQUENCE}, + {PIPE_SEQUENCE, TK_WHILE, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_UNTIL, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_BANG, PIPELINE, TK_BANG}, + {PIPE_SEQUENCE, SEPARATOR_OP, PIPELINE, 0}, + {PIPE_SEQUENCE, NEWLINE_LIST, PIPELINE, 0}, + {PIPE_SEQUENCE, LINEBREAK, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_PAREN_OPEN, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_LBRACE, PIPELINE, 0}, + {PIPE_SEQUENCE, COMPLETE_COMMANDS, PIPELINE, 0}, + {PIPE_SEQUENCE, AND_OR_MAJOR, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_DO, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_PAREN_CLOSE, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_IF, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_ELIF, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_THEN, PIPELINE, 0}, + {PIPE_SEQUENCE, TK_ELSE, PIPELINE, 0}, + {PIPE_SEQUENCE, COMPOUND_LIST, PIPELINE, 0}, + {PIPE_SEQUENCE, CASE_LIST_NS, PIPELINE, 0}, + {PIPE_SEQUENCE, COMPLETE_CONDITION, PIPELINE, 0}, + {PIPELINE, TK_WHILE, AND_OR, 0}, + {PIPELINE, TK_UNTIL, AND_OR, 0}, + {PIPELINE, TK_DO, AND_OR, 0}, + {PIPELINE, TK_PAREN_CLOSE, AND_OR, 0}, + {PIPELINE, TK_IF, AND_OR, 0}, + {PIPELINE, TK_IF, AND_OR, 0}, + {PIPELINE, TK_ELIF, AND_OR, 0}, + {PIPELINE, TK_THEN, AND_OR, 0}, + {PIPELINE, TK_ELSE, AND_OR, 0}, + {PIPELINE, COMPOUND_LIST, AND_OR, 0}, + {PIPELINE, CASE_LIST_NS, AND_OR, 0}, + {PIPELINE, LINEBREAK, AND_OR, 0}, + {PIPELINE, TK_BANG, AND_OR, 0}, + {PIPELINE, TK_PAREN_OPEN, AND_OR, 0}, + {PIPELINE, TK_LBRACE, AND_OR, 0}, + {PIPELINE, COMPLETE_COMMANDS, AND_OR, 0}, +// {PIPELINE, LINEBREAK, AND_OR, AND_OR}, + {PIPELINE, SEPARATOR_OP, AND_OR, 0}, + {PIPELINE, COMPLETE_CONDITION, AND_OR, 0}, + {PIPELINE, AND_OR_MAJOR, AND_OR, AND_OR_MAJOR}, + {AND_OR_MAJOR, AND_OR_MAJOR, AND_OR_MAJOR, AND_OR_MAJOR}, + {AND_OR, TK_DO, COMPOUND_LIST, 0}, + {AND_OR, TK_PAREN_CLOSE, COMPOUND_LIST, 0}, + {AND_OR, TK_WHILE, COMPOUND_LIST, 0}, + {AND_OR, TK_UNTIL, COMPOUND_LIST, 0}, + {AND_OR, TK_IF, COMPOUND_LIST, 0}, + {AND_OR, TK_ELIF, COMPOUND_LIST, 0}, + {AND_OR, TK_THEN, COMPOUND_LIST, 0}, + {AND_OR, TK_ELSE, COMPOUND_LIST, 0}, + {AND_OR, COMPOUND_LIST, COMPOUND_LIST, 0}, + {AND_OR, TK_PAREN_OPEN, COMPOUND_LIST, 0}, + {AND_OR, TK_LBRACE, COMPOUND_LIST, 0}, + {AND_OR, CASE_LIST_NS, CASE_LIST_NS, 0}, + {AND_OR, COMPLETE_CONDITION, COMPOUND_LIST, 0}, + {AND_OR, SEPARATOR_OP, LIST, LIST}, + {AND_OR, NEWLINE_LIST, LIST, 0}, + {AND_OR, LINEBREAK, LIST, 0}, + {AND_OR, TK_BANG, LIST, 0}, + {AND_OR, TK_LBRACE, LIST, 0}, + {AND_OR, COMPLETE_COMMANDS, LIST, 0}, + {LIST, NEWLINE_LIST, COMPLETE_COMMAND, 0}, + {LIST, LINEBREAK, COMPLETE_COMMAND, 0}, + {LIST, COMPLETE_COMMANDS, COMPLETE_COMMAND, 0}, + {COMPLETE_COMMAND, NEWLINE_LIST, COMPLETE_COMMANDS, COMPLETE_COMMANDS}, + {COMPLETE_COMMAND, LINEBREAK, COMPLETE_COMMANDS, 0}, + {COMPLETE_COMMAND, COMPLETE_COMMANDS, COMPLETE_COMMANDS, 0}, + {COMPLETE_COMMANDS, COMPLETE_COMMANDS, COMPLETE_COMMANDS, COMPLETE_COMMANDS}, + {0, 0, 0, 0}, +}; + +int aggregate_sym(t_list **stack, t_sym *new_sym, t_parstate *state) +{ + t_sym *head; + int i; + + if (!*stack || !*new_sym || !*state) + return (1); + i = 0; + head = (*stack)->content; +// DG("aggregate head %s && sym %s", +// read_state(*head), read_state(*new_sym)); + while (g_aggrematch[i].top) + { + if (*new_sym == g_aggrematch[i].top + && MATCH_STACK(*head, g_aggrematch[i].under)) + + { +// DG("MATCH : %s", read_state(g_aggrematch[i].new_sym)); + *new_sym = g_aggrematch[i].new_sym; + if (g_aggrematch[i].erase_sym) + { + pop_stack(stack, g_aggrematch[i].erase_sym); + head = (*stack)->content; +// DG("stack after pop: %s", read_state(*head)); + } + if (eval_sym(stack, *new_sym)) + { + *state = ERROR; + return (1); + } + aggregate_sym(stack, new_sym, state); + return (0); + } + i++; + } + return (0); +} diff --git a/42sh/src/parser/build_tree.c b/42sh/src/parser/build_tree.c new file mode 100644 index 00000000..a51e1241 --- /dev/null +++ b/42sh/src/parser/build_tree.c @@ -0,0 +1,90 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* build_tree.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/15 18:32:59 by ariard #+# #+# */ +/* Updated: 2017/03/07 19:32:15 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_treematch g_treematch[] = +{ + {TK_WORD, &add_cmd}, + {TK_PIPE, &add_sep}, + {TK_BANG, &add_sep}, + {TK_SEMI, &add_sep}, + {TK_GREAT, &add_cmd}, + {TK_LESS, &add_cmd}, + {TK_DGREAT, &add_cmd}, + {TK_DLESS, &add_cmd}, + {TK_IO_NUMBER, &add_cmd}, + {TK_OR_IF, &add_sep}, + {TK_AND_IF, &add_sep}, + {TK_AMP, &add_sep}, + {TK_WHILE, &add_cmd}, + {TK_UNTIL, &add_cmd}, + {TK_DO, &add_cmd}, + {TK_DONE, &add_cmd}, + {TK_IF, &add_cmd}, + {TK_ELIF, &add_cmd}, + {TK_ELSE, &add_cmd}, + {TK_THEN, &add_cmd}, + {TK_FI, &add_cmd}, + {TK_NEWLINE, &add_sep}, + {TK_CASE, &add_cmd}, + {TK_ESAC, &add_cmd}, + {TK_IN, &add_cmd}, + {TK_DSEMI, &add_cmd}, + {TK_PAREN_OPEN, &add_cmd}, + {TK_PAREN_CLOSE, &add_cmd}, + {TK_FOR, &add_cmd}, + {TK_NAME, &add_cmd}, + {TK_ASSIGNEMENT_WORD, &add_cmd}, + {SUBSHELL, &add_cmd}, + {TK_LBRACE, &add_cmd}, + {TK_RBRACE, &add_cmd}, + {CLOSE_LIST, &add_cmd}, + {0, NULL}, +}; + +static int isseparator(t_token *token, int cache) +{ + if (token->type == TK_NEWLINE && (cache == TK_WHILE || cache == TK_DO + || cache == TK_NEWLINE || cache == TK_THEN || cache == TK_IN + || cache == TK_DSEMI)) + return (0); +//check cache == WORD + return (1); +} + +int build_tree(t_btree **ast, t_list **lst) +{ + int i; + static int cache; + t_token *token; + + i = 0; + token = (*lst)->content; +//check bug de cache case ? + if (token->type == TK_PAREN_OPEN && cache != TK_IN && cache != TK_DSEMI + && cache != TK_WORD) + token->type = SUBSHELL; + while (g_treematch[i].type) + { + if ((isseparator(token, cache) && g_treematch[i].type == token->type)) + { + + DG("func TK : '%s' TK : '%s'", + read_state(g_treematch[i].type) ,read_state(token->type)); + cache = token->type; + return (g_treematch[i].add(ast, lst)); + } + i++; + } + return (0); +} diff --git a/42sh/src/parser/error_syntax.c b/42sh/src/parser/error_syntax.c new file mode 100644 index 00000000..e3ebe5e4 --- /dev/null +++ b/42sh/src/parser/error_syntax.c @@ -0,0 +1,88 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* error_syntax.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 20:15:35 by ariard #+# #+# */ +/* Updated: 2017/03/06 18:07:06 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_errormatch g_errormatch[] = +{ + {TK_NEWLINE, "newline"}, + {TK_SEMI, ";"}, + {TK_DSEMI, ";;"}, + {TK_PIPE, "|"}, + {TK_AMP, "&"}, + {TK_LESS, "<"}, + {TK_GREAT, ">"}, + {TK_DGREAT, ">>"}, + {TK_LESSAND, "<&"}, + {TK_GREATAND, ">&"}, + {TK_LESSGREAT, "<>"}, + {TK_CLOBBER, ">|"}, + {TK_DLESS, "<<"}, + {TK_DLESSDASH, "<<-"}, + {TK_AND_IF, "&&"}, + {TK_OR_IF, "||"}, + {TK_DSEMI, ";;"}, + {TK_IF, "if"}, + {TK_THEN, "then"}, + {TK_ELSE, "else"}, + {TK_ELIF, "elif"}, + {TK_FI, "fi"}, + {TK_DO, "do"}, + {TK_DONE, "done"}, + {TK_CASE, "case"}, + {TK_ESAC, "esac"}, + {TK_WHILE, "while"}, + {TK_UNTIL, "until"}, + {TK_FOR, "for"}, + {TK_LBRACE, "{"}, + {TK_RBRACE, "}"}, + {TK_PAREN_OPEN, "("}, + {TK_PAREN_CLOSE, ")"}, + {TK_BANG, "!"}, + {TK_IN, "in"}, + {0, NULL}, +}; + +int error_syntax(t_list **lst, t_parser *parser, + t_btree **ast) +{ + t_token *token; + int i; + int temp; + + token = (*lst)->content; + i = 0; + temp = 0; + while (g_errormatch[i].token) + { + if (g_errormatch[i].token == token->type) + { + ft_putstr_fd("syntax error near unexpected token `", 2); + ft_putstr_fd(g_errormatch[i].error, 2); + ft_putstr_fd("'\n", 2); + temp = 1; + break ; + } + i++; + } + instruction_free(lst, parser, ast); + if (temp == 0) + ft_putstr_fd("grammar error, notify ariard", 2); + return (0); +} + +int error_EOF(t_list **lst, t_parser *parser, t_btree **ast) +{ + ft_putstr_fd("syntax error near unexpected EOF", 2); + instruction_free(lst, parser, ast); + return (0); +} diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c new file mode 100644 index 00000000..5919b135 --- /dev/null +++ b/42sh/src/parser/eval_sym.c @@ -0,0 +1,1136 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* eval_sym.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 16:26:30 by ariard #+# #+# */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_stackmatch g_stackmatch[] = +{ + {TK_WORD, CMD_SUFFIX}, + {TK_WORD, TK_PIPE}, + {TK_WORD, TK_CASE}, + {TK_WORD, WORDLIST}, + {TK_WORD, LINEBREAK}, + {TK_WORD, TK_BANG}, + {TK_WORD, TK_PAREN_OPEN}, + {TK_WORD, TK_LBRACE}, + {TK_WORD, COMPLETE_COMMANDS}, + {TK_WORD, TK_IN}, + {TK_WORD, FOR_WORDLIST}, + {TK_WORD, MATH}, + {TK_ASSIGNEMENT_WORD, CMD_PREFIX}, + {TK_IO_NUMBER, REDIRECT_LIST}, + {TK_IO_NUMBER, CMD_SUFFIX}, + {TK_IO_NUMBER, CMD_PREFIX}, + {TK_IO_NUMBER, CMD_NAME}, + {TK_IO_NUMBER, CMD_WORD}, + {TK_IO_NUMBER, LINEBREAK}, + {TK_IO_NUMBER, TK_BANG}, + {TK_IO_NUMBER, TK_PAREN_OPEN}, + {TK_IO_NUMBER, TK_LBRACE}, + {TK_IO_NUMBER, COMPLETE_COMMANDS}, + {TK_IO_NUMBER, TK_BANG}, + {TK_IO_NUMBER, SEPARATOR_OP}, + {TK_IO_NUMBER, NEWLINE_LIST}, + {TK_IO_NUMBER, PIPE_SEMI_SEQUENCE}, + {TK_IO_NUMBER, SEQUENCE}, +// watch! + {TK_IO_NUMBER, CMD_SUPERIOR}, + {TK_IO_NUMBER, AND_OR_MAJOR}, + {TK_AND_IF, AND_OR}, + {TK_AND_IF, CMD_SUPERIOR}, + {TK_OR_IF, AND_OR}, + {TK_OR_IF, CMD_SUPERIOR}, + {TK_OR_IF, AND_OR}, + {TK_DSEMI, LINEBREAK}, + {TK_DSEMI, TK_BANG}, + {TK_DSEMI, COMPLETE_COMMANDS}, + {TK_DSEMI, COMPOUND_LIST}, + {TK_DSEMI, CASE_LIST_NS}, + {TK_DSEMI, CMD_SUPERIOR}, + {TK_DSEMI, PIPE_SEMI_SEQUENCE}, + {TK_DSEMI, SEQUENCE}, +// watch! + {TK_LESS, TK_IO_NUMBER}, + {TK_LESS, REDIRECT_LIST}, + {TK_LESS, CMD_SUFFIX}, + {TK_LESS, CMD_PREFIX}, + {TK_LESS, CMD_WORD}, + {TK_LESS, CMD_NAME}, + {TK_LESS, LINEBREAK}, + {TK_LESS, TK_BANG}, + {TK_LESS, TK_PAREN_OPEN}, + {TK_LESS, TK_LBRACE}, + {TK_LESS, COMPLETE_COMMANDS}, + {TK_LESS, TK_BANG}, + {TK_LESS, SEPARATOR_OP}, + {TK_LESS, NEWLINE_LIST}, + {TK_LESS, PIPE_SEMI_SEQUENCE}, + {TK_LESS, SEQUENCE}, +// watch ! + {TK_LESS, CMD_SUPERIOR}, + {TK_LESS, AND_OR_MAJOR}, + {TK_GREAT, TK_IO_NUMBER}, + {TK_GREAT, REDIRECT_LIST}, + {TK_GREAT, CMD_SUFFIX}, + {TK_GREAT, CMD_PREFIX}, + {TK_GREAT, CMD_WORD}, + {TK_GREAT, CMD_NAME}, + {TK_GREAT, LINEBREAK}, + {TK_GREAT, TK_BANG}, + {TK_GREAT, TK_PAREN_OPEN}, + {TK_GREAT, TK_LBRACE}, + {TK_GREAT, COMPLETE_COMMANDS}, + {TK_GREAT, TK_BANG}, + {TK_GREAT, SEPARATOR_OP}, + {TK_GREAT, NEWLINE_LIST}, + {TK_GREAT, PIPE_SEMI_SEQUENCE}, + {TK_GREAT, SEQUENCE}, +// watch ! +//duplicate and extend + {TK_GREAT, CMD_SUPERIOR}, + {TK_GREAT, AND_OR_MAJOR}, + + {TK_DLESS, TK_IO_NUMBER}, + {TK_DLESS, REDIRECT_LIST}, + {TK_DLESS, CMD_SUFFIX}, + {TK_DLESS, CMD_PREFIX}, + {TK_DLESS, CMD_WORD}, + {TK_DLESS, CMD_NAME}, + {TK_DLESS, LINEBREAK}, + {TK_DLESS, TK_BANG}, + {TK_DLESS, TK_PAREN_OPEN}, + {TK_DLESS, TK_LBRACE}, + {TK_DLESS, COMPLETE_COMMANDS}, + {TK_DLESS, TK_BANG}, + {TK_DLESS, SEPARATOR_OP}, + {TK_DLESS, NEWLINE_LIST}, + {TK_DLESS, PIPE_SEMI_SEQUENCE}, + {TK_DLESS, SEQUENCE}, +// watch ! + {TK_DLESS, CMD_SUPERIOR}, + {TK_DLESS, AND_OR_MAJOR}, + + {TK_DLESSDASH, TK_IO_NUMBER}, + {TK_DLESSDASH, REDIRECT_LIST}, + {TK_DLESSDASH, CMD_SUFFIX}, + {TK_DLESSDASH, CMD_PREFIX}, + {TK_DLESSDASH, CMD_WORD}, + {TK_DLESSDASH, CMD_NAME}, + {TK_DLESSDASH, LINEBREAK}, + {TK_DLESSDASH, TK_BANG}, + {TK_DLESSDASH, TK_PAREN_OPEN}, + {TK_DLESSDASH, TK_LBRACE}, + {TK_DLESSDASH, COMPLETE_COMMANDS}, + {TK_DLESSDASH, TK_BANG}, + {TK_DLESSDASH, TK_BANG}, + {TK_DLESSDASH, SEPARATOR_OP}, + {TK_DLESSDASH, NEWLINE_LIST}, + {TK_DLESSDASH, PIPE_SEMI_SEQUENCE}, + {TK_DLESSDASH, SEQUENCE}, +// watch ! + {TK_DLESSDASH, CMD_SUPERIOR}, + {TK_DLESSDASH, AND_OR_MAJOR}, + + {TK_DGREAT, TK_IO_NUMBER}, + {TK_DGREAT, REDIRECT_LIST}, + {TK_DGREAT, CMD_SUFFIX}, + {TK_DGREAT, CMD_PREFIX}, + {TK_DGREAT, CMD_WORD}, + {TK_DGREAT, CMD_NAME}, + {TK_DGREAT, LINEBREAK}, + {TK_DGREAT, TK_BANG}, + {TK_DGREAT, TK_PAREN_OPEN}, + {TK_DGREAT, TK_LBRACE}, + {TK_DGREAT, COMPLETE_COMMANDS}, + {TK_DGREAT, TK_BANG}, + {TK_DGREAT, TK_BANG}, + {TK_DGREAT, SEPARATOR_OP}, + {TK_DGREAT, NEWLINE_LIST}, + {TK_DGREAT, PIPE_SEMI_SEQUENCE}, + {TK_DGREAT, SEQUENCE}, +// watch ! + {TK_DGREAT, CMD_SUPERIOR}, + {TK_DGREAT, AND_OR_MAJOR}, + + {TK_LESSAND, TK_IO_NUMBER}, + {TK_LESSAND, REDIRECT_LIST}, + {TK_LESSAND, CMD_SUFFIX}, + {TK_LESSAND, CMD_PREFIX}, + {TK_LESSAND, CMD_WORD}, + {TK_LESSAND, CMD_NAME}, + {TK_LESSAND, LINEBREAK}, + {TK_LESSAND, TK_BANG}, + {TK_LESSAND, TK_PAREN_OPEN}, + {TK_LESSAND, TK_LBRACE}, + {TK_LESSAND, COMPLETE_COMMANDS}, + {TK_LESSAND, TK_BANG}, + {TK_LESSAND, TK_BANG}, + {TK_LESSAND, SEPARATOR_OP}, + {TK_LESSAND, NEWLINE_LIST}, + {TK_LESSAND, PIPE_SEMI_SEQUENCE}, + {TK_LESSAND, SEQUENCE}, +// watch ! + {TK_LESSAND, CMD_SUPERIOR}, + {TK_LESSAND, AND_OR_MAJOR}, + + {TK_GREATAND, TK_IO_NUMBER}, + {TK_GREATAND, REDIRECT_LIST}, + {TK_GREATAND, CMD_SUFFIX}, + {TK_GREATAND, CMD_PREFIX}, + {TK_GREATAND, CMD_WORD}, + {TK_GREATAND, CMD_NAME}, + {TK_GREATAND, LINEBREAK}, + {TK_GREATAND, TK_BANG}, + {TK_GREATAND, TK_PAREN_OPEN}, + {TK_GREATAND, TK_LBRACE}, + {TK_GREATAND, COMPLETE_COMMANDS}, + {TK_LESSAND, TK_BANG}, + {TK_GREATAND, TK_BANG}, + {TK_GREATAND, SEPARATOR_OP}, + {TK_GREATAND, NEWLINE_LIST}, + {TK_GREATAND, PIPE_SEMI_SEQUENCE}, + {TK_GREATAND, SEQUENCE}, +// watch ! + {TK_GREATAND, CMD_SUPERIOR}, + {TK_GREATAND, AND_OR_MAJOR}, + + + {TK_IF, LINEBREAK}, + {TK_IF, TK_BANG}, + {TK_IF, TK_PAREN_OPEN}, + {TK_IF, TK_LBRACE}, + {TK_IF, COMPLETE_COMMANDS}, + {TK_IF, TK_BANG}, + {TK_IF, SEPARATOR_OP}, + {TK_IF, NEWLINE_LIST}, + {TK_IF, SEQUENCE}, +// watch ! + {TK_IF, TK_WHILE}, + {TK_IF, TK_UNTIL}, + {TK_IF, TK_IF}, + {TK_IF, TK_DO}, + {TK_IF, TK_ELIF}, + {TK_IF, TK_ELSE}, + {TK_IF, TK_THEN}, + {TK_IF, TK_PAREN_CLOSE}, + {TK_IF, COMPLETE_CONDITION}, + {TK_IF, COMPOUND_LIST}, + {TK_IF, CASE_LIST_NS}, + {TK_THEN, CONDITION}, + {TK_THEN, COMPOUND_LIST}, + {TK_ELSE, COMPOUND_LIST}, + {TK_ELSE, CONDITION}, + {TK_ELSE, COMPLETE_CONDITION}, + {TK_ELIF, COMPOUND_LIST}, + {TK_ELIF, COMPLETE_CONDITION}, + {TK_ELIF, CONDITION}, + {TK_FI, ELSE_PART}, + {TK_FI, COMPOUND_LIST}, + {TK_FI, CMD_SUPERIOR}, + {TK_FI, END_COMMAND}, + {TK_FI, CONDITION}, + {TK_DO, CMD_SUPERIOR}, + {TK_FI, COMPLETE_CONDITION}, + {TK_DO, COMPOUND_LIST}, + {TK_DO, NAME}, + {TK_DO, SEQUENTIAL_SEP}, + {TK_DONE, CMD_SUPERIOR}, + {TK_DONE, COMPOUND_LIST}, + {TK_DONE, END_COMMAND}, + {TK_CASE, LINEBREAK}, + {TK_CASE, TK_BANG}, + {TK_CASE, TK_PAREN_OPEN}, + {TK_CASE, TK_LBRACE}, + {TK_CASE, COMPLETE_COMMANDS}, + {TK_CASE, TK_BANG}, + {TK_CASE, TK_DO}, + {TK_CASE, TK_THEN}, + {TK_CASE, TK_PAREN_CLOSE}, + {TK_CASE, TK_WHILE}, + {TK_CASE, TK_UNTIL}, + {TK_CASE, TK_IF}, + {TK_CASE, TK_ELIF}, + {TK_CASE, TK_ELSE}, + {TK_CASE, COMPLETE_CONDITION}, + {TK_CASE, CASE_LIST_NS}, + {TK_CASE, COMPOUND_LIST}, + {TK_CASE, NEWLINE_LIST}, + {TK_CASE, SEPARATOR_OP}, + {TK_CASE, SEQUENCE}, +// watch ! + {TK_IN, TK_WORD}, + {TK_IN, NAME}, + {TK_ESAC, CASE_LIST_NS}, + {TK_ESAC, LINEBREAK}, + {TK_ESAC, TK_BANG}, + {TK_ESAC, TK_IN}, + {TK_WHILE, LINEBREAK}, + {TK_WHILE, TK_BANG}, + {TK_WHILE, TK_PAREN_OPEN}, + {TK_WHILE, TK_LBRACE}, + {TK_WHILE, COMPLETE_COMMANDS}, + {TK_WHILE, TK_BANG}, + {TK_WHILE, SEPARATOR_OP}, + {TK_WHILE, NEWLINE_LIST}, + {TK_WHILE, SEQUENCE}, +// watch ! + {TK_WHILE, TK_DO}, + {TK_WHILE, TK_PAREN_CLOSE}, + {TK_WHILE, TK_WHILE}, + {TK_WHILE, COMPOUND_LIST}, + {TK_WHILE, CASE_LIST_NS}, + {TK_WHILE, TK_IF}, + {TK_WHILE, TK_ELIF}, + {TK_WHILE, TK_ELSE}, + {TK_WHILE, TK_PAREN_CLOSE}, + {TK_WHILE, TK_THEN}, + {TK_WHILE, COMPLETE_CONDITION}, + {TK_UNTIL, LINEBREAK}, + {TK_UNTIL, TK_BANG}, + {TK_UNTIL, TK_PAREN_OPEN}, + {TK_UNTIL, TK_LBRACE}, + {TK_UNTIL, COMPLETE_COMMANDS}, + {TK_UNTIL, TK_BANG}, + {TK_UNTIL, SEPARATOR_OP}, + {TK_UNTIL, NEWLINE_LIST}, + {TK_UNTIL, SEQUENCE}, +// watch ! + {TK_UNTIL, TK_DO}, + {TK_UNTIL, TK_PAREN_CLOSE}, + {TK_UNTIL, TK_WHILE}, + {TK_UNTIL, COMPOUND_LIST}, + {TK_UNTIL, CASE_LIST_NS}, + {TK_UNTIL, TK_IF}, + {TK_UNTIL, TK_ELIF}, + {TK_UNTIL, TK_ELSE}, + {TK_UNTIL, TK_THEN}, + {TK_UNTIL, TK_PAREN_CLOSE}, + {TK_UNTIL, COMPLETE_CONDITION}, + {TK_FOR, LINEBREAK}, + {TK_FOR, TK_BANG}, + {TK_FOR, TK_PAREN_OPEN}, + {TK_FOR, TK_LBRACE}, + {TK_FOR, COMPLETE_COMMANDS}, + {TK_FOR, TK_BANG}, + {TK_FOR, TK_BANG}, + {TK_FOR, SEPARATOR_OP}, + {TK_FOR, NEWLINE_LIST}, + {TK_FOR, SEQUENCE}, +// watch ! + {TK_FOR, TK_DO}, + {TK_FOR, TK_PAREN_CLOSE}, + {TK_FOR, TK_WHILE}, + {TK_FOR, COMPOUND_LIST}, + {TK_FOR, CASE_LIST_NS}, + {TK_FOR, TK_IF}, + {TK_FOR, TK_ELIF}, + {TK_FOR, TK_THEN}, + {TK_FOR, TK_ELSE}, + {TK_FOR, TK_PAREN_CLOSE}, + {TK_FOR, COMPLETE_CONDITION}, + {TK_LBRACE, COMPLETE_COMMANDS}, + {TK_LBRACE, LINEBREAK}, + {TK_LBRACE, TK_BANG}, + {TK_LBRACE, TK_LBRACE}, + {TK_LBRACE, TK_BANG}, + {TK_LBRACE, SEPARATOR_OP}, + {TK_LBRACE, NEWLINE_LIST}, + {TK_LBRACE, SEQUENCE}, +// watch ! + {TK_LBRACE, AND_OR_MAJOR}, + {TK_LBRACE, TK_WHILE}, + {TK_LBRACE, TK_UNTIL}, + {TK_LBRACE, TK_DO}, + {TK_LBRACE, TK_PAREN_CLOSE}, + {TK_LBRACE, TK_LBRACE}, + {TK_LBRACE, TK_IF}, + {TK_LBRACE, TK_ELIF}, + {TK_LBRACE, TK_THEN}, + {TK_LBRACE, TK_ELSE}, + {TK_LBRACE, COMPOUND_LIST}, + {TK_LBRACE, CASE_LIST_NS}, + {TK_LBRACE, COMPLETE_CONDITION}, + {TK_LBRACE, TK_IN}, + {TK_RBRACE, TK_SEMI}, + {TK_RBRACE, END_COMMAND}, + {TK_RBRACE, SEPARATOR_OP}, + {TK_RBRACE, WORD}, + {TK_RBRACE, IN}, + {TK_RBRACE, TK_AND_IF}, + {TK_RBRACE, TK_OR_IF}, + {TK_RBRACE, TK_PIPE}, + {TK_RBRACE, TK_RBRACE}, + {TK_RBRACE, COMPLETE_COMMANDS}, + {TK_RBRACE, CMD_SUPERIOR}, + {TK_RBRACE, PIPE_SEMI_SEQUENCE}, + {TK_RBRACE, CASE_LIST_NS}, + {TK_RBRACE, PROGRAM}, + {TK_RBRACE, TK_PAREN_OPEN}, + {TK_RBRACE, TK_LBRACE}, + {TK_RBRACE, PATTERN_CASE}, + {TK_RBRACE, PATTERN}, + {TK_RBRACE, COMPOUND_LIST}, + {TK_RBRACE, FUNC_NAME}, + {TK_BANG, LINEBREAK}, + {TK_BANG, TK_PAREN_OPEN}, + {TK_BANG, TK_LBRACE}, + {TK_BANG, COMPLETE_COMMANDS}, + {TK_BANG, SEPARATOR_OP}, + {TK_BANG, NEWLINE_LIST}, + {TK_IN, LINEBREAK}, + {TK_SEMI, NAME}, + {TK_SEMI, IN}, + {TK_SEMI, WORDLIST}, + {TK_SEMI, LIST}, + {TK_SEMI, TERM}, + {TK_SEMI, CMD_NAME}, + {TK_SEMI, PROGRAM}, + {TK_SEMI, FOR_WORDLIST}, + {TK_AMP, LIST}, + {TK_AMP, TERM}, + {TK_PIPE, PATTERN}, + {TK_PIPE, CMD_SUPERIOR}, + {TK_PIPE, PIPE_SEMI_SEQUENCE}, + {PATTERN_CASE, TK_IN}, + {PATTERN_CASE, CASE_LIST_NS}, + {TK_PAREN_OPEN, COMPLETE_COMMANDS}, + {TK_PAREN_OPEN, LINEBREAK}, + {TK_PAREN_OPEN, TK_BANG}, + {TK_PAREN_OPEN, TK_PAREN_OPEN}, + {TK_PAREN_OPEN, SEPARATOR_OP}, + {TK_PAREN_OPEN, NEWLINE_LIST}, + {TK_PAREN_OPEN, SEQUENCE}, +// watch ! + {TK_PAREN_OPEN, AND_OR_MAJOR}, + {TK_PAREN_OPEN, TK_WHILE}, + {TK_PAREN_OPEN, TK_UNTIL}, + {TK_PAREN_OPEN, TK_DO}, + {TK_PAREN_OPEN, TK_PAREN_CLOSE}, + {TK_PAREN_OPEN, TK_IF}, + {TK_PAREN_OPEN, TK_ELIF}, + {TK_PAREN_OPEN, TK_THEN}, + {TK_PAREN_OPEN, TK_ELSE}, + {TK_PAREN_OPEN, COMPOUND_LIST}, + {TK_PAREN_OPEN, CASE_LIST_NS}, + {TK_PAREN_OPEN, COMPLETE_CONDITION}, + {TK_PAREN_OPEN, TK_IN}, + {TK_PAREN_OPEN, CMD_SUPERIOR}, + {SEQUENTIAL_SEP, NAME}, + {SEQUENTIAL_SEP, IN}, + {SEQUENTIAL_SEP, WORDLIST}, + {SEQUENTIAL_SEP, FOR_WORDLIST}, + {END_COMMAND, SEQUENCE}, + {END_COMMAND, PIPE_SEMI_SEQUENCE}, + {END_COMMAND, AND_OR_MAJOR}, + {END_COMMAND, TK_WHILE}, + {END_COMMAND, TK_WHILE}, + {END_COMMAND, TK_UNTIL}, + {END_COMMAND, TK_DO}, + {END_COMMAND, TK_PAREN_CLOSE}, + {END_COMMAND, TK_IF}, + {END_COMMAND, TK_THEN}, + {END_COMMAND, TK_ELIF}, + {END_COMMAND, TK_ELSE}, + {END_COMMAND, LINEBREAK}, + {END_COMMAND, TK_BANG}, + {END_COMMAND, TK_PAREN_OPEN}, + {END_COMMAND, TK_LBRACE}, + {END_COMMAND, COMPLETE_COMMANDS}, + {END_COMMAND, COMPOUND_LIST}, + {END_COMMAND, CASE_LIST_NS}, + {END_COMMAND, COMPLETE_CONDITION}, + {SEPARATOR, MATH_SUP}, + {SEPARATOR, CMD_SUPERIOR}, + {SEPARATOR, TERM}, + {SEPARATOR, COMPOUND_LIST}, + {SEPARATOR, CASE_LIST_NS}, + {SEPARATOR, PIPE_SEMI_SEQUENCE}, + {SEPARATOR_OP, MATH_SUP}, + {SEPARATOR_OP, CMD_SUPERIOR}, + {SEPARATOR_OP, LIST}, + {SEPARATOR_OP, TERM}, + {SEPARATOR_OP, CASE_LIST_NS}, + {SEPARATOR_OP, COMPOUND_LIST}, + {SEPARATOR_OP, PIPE_SEMI_SEQUENCE}, + {LINEBREAK, MATH_SUP}, + {LINEBREAK, TK_SEMI}, + {LINEBREAK, END_COMMAND}, + {LINEBREAK, SEPARATOR_OP}, + {LINEBREAK, TK_PAREN_CLOSE}, + {LINEBREAK, WORD}, + {LINEBREAK, IN}, + {LINEBREAK, TK_AND_IF}, + {LINEBREAK, TK_OR_IF}, + {LINEBREAK, TK_PIPE}, + {LINEBREAK, LINEBREAK}, + {LINEBREAK, TK_BANG}, + {LINEBREAK, COMPLETE_COMMANDS}, + {LINEBREAK, CMD_SUPERIOR}, + {LINEBREAK, PIPE_SEMI_SEQUENCE}, + {LINEBREAK, COMPOUND_LIST}, + {LINEBREAK, CASE_LIST_NS}, + {LINEBREAK, PROGRAM}, + {LINEBREAK, TK_PAREN_OPEN}, + {LINEBREAK, TK_LBRACE}, + {TK_PAREN_CLOSE, MATH}, + {TK_PAREN_CLOSE, MATH_PLUS}, + {TK_PAREN_CLOSE, TK_SEMI}, + {TK_PAREN_CLOSE, END_COMMAND}, + {TK_PAREN_CLOSE, SEPARATOR_OP}, + {TK_PAREN_CLOSE, WORD}, + {TK_PAREN_CLOSE, IN}, + {TK_PAREN_CLOSE, TK_AND_IF}, + {TK_PAREN_CLOSE, TK_OR_IF}, + {TK_PAREN_CLOSE, TK_PIPE}, + {TK_PAREN_CLOSE, TK_PAREN_CLOSE}, + {TK_PAREN_CLOSE, COMPLETE_COMMANDS}, + {TK_PAREN_CLOSE, CMD_SUPERIOR}, + {TK_PAREN_CLOSE, PIPE_SEMI_SEQUENCE}, + {TK_PAREN_CLOSE, CASE_LIST_NS}, + {TK_PAREN_CLOSE, PROGRAM}, + {TK_PAREN_CLOSE, TK_LBRACE}, + {TK_PAREN_CLOSE, PATTERN_CASE}, + {TK_PAREN_CLOSE, PATTERN}, + {TK_PAREN_CLOSE, COMPOUND_LIST}, + {TK_PAREN_CLOSE, FUNC_NAME}, + {TK_RBRACE, MATH}, + {TK_RBRACE, MATH_PLUS}, + {TK_RBRACE, TK_SEMI}, + {TK_RBRACE, END_COMMAND}, + {TK_RBRACE, SEPARATOR_OP}, + {TK_RBRACE, WORD}, + {TK_RBRACE, IN}, + {TK_RBRACE, TK_AND_IF}, + {TK_RBRACE, TK_OR_IF}, + {TK_RBRACE, TK_PIPE}, + {TK_RBRACE, TK_RBRACE}, + {TK_RBRACE, COMPLETE_COMMANDS}, + {TK_RBRACE, CMD_SUPERIOR}, + {TK_RBRACE, PIPE_SEMI_SEQUENCE}, + {TK_RBRACE, CASE_LIST_NS}, + {TK_RBRACE, PROGRAM}, + {TK_RBRACE, TK_LBRACE}, + {TK_RBRACE, PATTERN_CASE}, + {TK_RBRACE, PATTERN}, + {TK_RBRACE, COMPOUND_LIST}, + {TK_RBRACE, FUNC_NAME}, + {NEWLINE_LIST, MATH_SUP}, + {NEWLINE_LIST, TK_DO}, + {NEWLINE_LIST, CASE_LIST_NS}, + {NEWLINE_LIST, TK_PAREN_CLOSE}, + {NEWLINE_LIST, TK_RBRACE}, + {NEWLINE_LIST, SEQUENTIAL_SEP}, + {NEWLINE_LIST, FOR_WORDLIST}, + {NEWLINE_LIST, TK_IN}, + {NEWLINE_LIST, TK_WHILE}, + {NEWLINE_LIST, TK_UNTIL}, + {NEWLINE_LIST, TK_IF}, + {NEWLINE_LIST, TK_ELIF}, + {NEWLINE_LIST, TK_THEN}, + {NEWLINE_LIST, TK_ELSE}, + {NEWLINE_LIST, CMD_NAME}, + {NEWLINE_LIST, NEWLINE_LIST}, + {NEWLINE_LIST, NAME}, + {NEWLINE_LIST, IN}, + {NEWLINE_LIST, WORDLIST}, + {NEWLINE_LIST, TERM}, + {NEWLINE_LIST, COMPOUND_LIST}, + {NEWLINE_LIST, CASE_LIST_NS}, + {NEWLINE_LIST, COMPLETE_COMMANDS}, + {NEWLINE_LIST, COMPLETE_CONDITION}, + {NEWLINE_LIST, CONDITION}, + {NEWLINE_LIST, LINEBREAK}, + {NEWLINE_LIST, TK_BANG}, + {NEWLINE_LIST, TK_PAREN_OPEN}, + {NEWLINE_LIST, TK_LBRACE}, + {NEWLINE_LIST, PROGRAM}, + {HERE_END, TK_DLESS}, + {HERE_END, TK_DLESS}, + {HERE_END, TK_DLESSDASH}, + {IO_HERE, TK_IO_NUMBER}, + {IO_HERE, CMD_SUPERIOR}, + {IO_HERE, REDIRECT_LIST}, + {IO_HERE, CMD_SUFFIX}, + {IO_HERE, CMD_PREFIX}, + {IO_HERE, CMD_WORD}, + {IO_HERE, CMD_NAME}, + {IO_HERE, LINEBREAK}, + {IO_HERE, TK_BANG}, + {IO_HERE, TK_PAREN_OPEN}, + {IO_HERE, TK_LBRACE}, + {IO_HERE, COMPLETE_COMMANDS}, + {IO_HERE, SEPARATOR_OP}, + {IO_HERE, NEWLINE_LIST}, + {IO_HERE, PIPE_SEMI_SEQUENCE}, + {IO_HERE, SEQUENCE}, +// watch ! + {FILENAME, TK_LESS}, + {FILENAME, TK_LESSAND}, + {FILENAME, TK_GREAT}, + {FILENAME, TK_GREATAND}, + {FILENAME, TK_DGREAT}, + {FILENAME, TK_LESSGREAT}, + {FILENAME, TK_CLOBBER}, + {IO_FILE, TK_IO_NUMBER}, + {IO_FILE, CMD_SUPERIOR}, + {IO_FILE, REDIRECT_LIST}, + {IO_FILE, CMD_SUFFIX}, + {IO_FILE, CMD_PREFIX}, + {IO_FILE, CMD_WORD}, + {IO_FILE, CMD_NAME}, + {IO_FILE, LINEBREAK}, + {IO_FILE, TK_BANG}, + {IO_FILE, COMPLETE_COMMANDS}, + {IO_FILE, SEPARATOR_OP}, + {IO_FILE, NEWLINE_LIST}, + {IO_FILE, PIPE_SEMI_SEQUENCE}, + {IO_FILE, SEQUENCE}, +// watch ! + {IO_REDIRECT, REDIRECT_LIST}, + {IO_REDIRECT, CMD_SUPERIOR}, + {IO_REDIRECT, CMD_SUFFIX}, + {IO_REDIRECT, CMD_PREFIX}, + {IO_REDIRECT, CMD_WORD}, + {IO_REDIRECT, CMD_NAME}, + {IO_REDIRECT, LINEBREAK}, + {IO_REDIRECT, TK_BANG}, + {IO_REDIRECT, TK_PAREN_OPEN}, + {IO_REDIRECT, TK_LBRACE}, + {IO_REDIRECT, COMPLETE_COMMANDS}, + {IO_REDIRECT, SEPARATOR_OP}, + {IO_REDIRECT, NEWLINE_LIST}, + {IO_REDIRECT, PIPE_SEMI_SEQUENCE}, + {IO_REDIRECT, SEQUENCE}, +// watch !/ + {REDIRECT_LIST, COMPOUND_COMMAND}, + {CMD_SUFFIX, CMD_WORD}, + {CMD_SUFFIX, CMD_NAME}, + {CMD_SUFFIX, CMD_SUPERIOR}, + {CMD_SUFFIX, PIPE_SEMI_SEQUENCE}, + {CMD_PREFIX, LINEBREAK}, + {CMD_PREFIX, TK_PAREN_OPEN}, + {CMD_PREFIX, TK_LBRACE}, + {CMD_PREFIX, COMPLETE_COMMANDS}, + {CMD_PREFIX, TK_BANG}, + {CMD_PREFIX, SEPARATOR_OP}, + {CMD_PREFIX, NEWLINE_LIST}, + {CMD_PREFIX, SEQUENCE}, +// watch ! + {CMD_WORD, CMD_PREFIX}, + {CMD_NAME, COMPLETE_COMMANDS}, + {CMD_NAME, LINEBREAK}, + {CMD_NAME, TK_PAREN_OPEN}, + {CMD_NAME, TK_LBRACE}, + {CMD_NAME, TK_BANG}, + {CMD_NAME, SEPARATOR_OP}, + {CMD_NAME, NEWLINE_LIST}, + {CMD_NAME, SEQUENCE}, +// watch ! + {CMD_NAME, AND_OR_MAJOR}, + {CMD_NAME, TK_WHILE}, + {CMD_NAME, TK_UNTIL}, + {CMD_NAME, TK_DO}, + {CMD_NAME, TK_PAREN_CLOSE}, + {CMD_NAME, TK_IF}, + {CMD_NAME, TK_ELIF}, + {CMD_NAME, TK_THEN}, + {CMD_NAME, TK_ELSE}, + {CMD_NAME, COMPOUND_LIST}, + {CMD_NAME, CASE_LIST_NS}, + {CMD_NAME, COMPLETE_CONDITION}, + + {CMD_SUPERIOR, TK_WHILE}, + {CMD_SUPERIOR, TK_UNTIL}, + {CMD_SUPERIOR, TK_DO}, + {CMD_SUPERIOR, TK_PAREN_CLOSE}, + {CMD_SUPERIOR, TK_IF}, + {CMD_SUPERIOR, TK_ELIF}, + {CMD_SUPERIOR, TK_THEN}, + {CMD_SUPERIOR, TK_ELSE}, + {CMD_SUPERIOR, COMPOUND_LIST}, + {CMD_SUPERIOR, CASE_LIST_NS}, + {CMD_SUPERIOR, COMPLETE_CONDITION}, + {CMD_SUPERIOR, LINEBREAK}, + {CMD_SUPERIOR, TK_PAREN_OPEN}, + {CMD_SUPERIOR, TK_LBRACE}, + {CMD_SUPERIOR, COMPLETE_COMMANDS}, + {CMD_SUPERIOR, TK_BANG}, + {CMD_SUPERIOR, SEPARATOR_OP}, + {CMD_SUPERIOR, NEWLINE_LIST}, + {CMD_SUPERIOR, TK_PIPE}, + {CMD_SUPERIOR, SEQUENCE}, +// watch ! + {CMD_SUPERIOR, AND_OR_MAJOR}, + + {MATH, LINEBREAK}, + {MATH, NEWLINE_LIST}, + {MATH, SEPARATOR}, + {MATH, SEPARATOR_OP}, + {MATH_PLUS, LINEBREAK}, + {MATH_PLUS, NEWLINE_LIST}, + {MATH_PLUS, SEPARATOR}, + {MATH_PLUS, SEPARATOR_OP}, + {MATH_SUP, LINEBREAK}, + {MATH_SUP, NEWLINE_LIST}, + {MATH_SUP, SEPARATOR}, + {MATH_SUP, SEPARATOR_OP}, + + {SIMPLE_COMMAND, TK_WHILE}, + {SIMPLE_COMMAND, TK_UNTIL}, + {SIMPLE_COMMAND, TK_DO}, + {SIMPLE_COMMAND, TK_PAREN_CLOSE}, + {SIMPLE_COMMAND, TK_IF}, + {SIMPLE_COMMAND, TK_ELIF}, + {SIMPLE_COMMAND, TK_THEN}, + {SIMPLE_COMMAND, TK_ELSE}, + {SIMPLE_COMMAND, COMPOUND_LIST}, + {SIMPLE_COMMAND, CASE_LIST_NS}, + {SIMPLE_COMMAND, COMPLETE_CONDITION}, + {SIMPLE_COMMAND, LINEBREAK}, + {SIMPLE_COMMAND, TK_PAREN_OPEN}, + {SIMPLE_COMMAND, TK_LBRACE}, + {SIMPLE_COMMAND, COMPLETE_COMMANDS}, + {SIMPLE_COMMAND, TK_BANG}, + {SIMPLE_COMMAND, SEPARATOR_OP}, + {SIMPLE_COMMAND, NEWLINE_LIST}, + {SIMPLE_COMMAND, SEQUENCE}, +// watch ! + {SIMPLE_COMMAND, AND_OR_MAJOR}, + {DO_GROUP, CMD_SUPERIOR}, + {DO_GROUP, COMPOUND_LIST}, + {DO_GROUP, NAME}, + {DO_GROUP, SEQUENTIAL_SEP}, + {LOOP, TK_WHILE}, + {LOOP, TK_UNTIL}, + {CONDITION, LINEBREAK}, + {CONDITION, TK_PAREN_OPEN}, + {CONDITION, TK_LBRACE}, + {CONDITION, COMPLETE_COMMANDS}, + {CONDITION, COMPOUND_LIST}, + {CONDITION, CASE_LIST_NS}, + {CONDITION, COMPLETE_CONDITION}, + {COMPLETE_CONDITION, LINEBREAK}, + {COMPLETE_CONDITION, TK_PAREN_OPEN}, + {COMPLETE_CONDITION, TK_LBRACE}, + {COMPLETE_CONDITION, COMPLETE_COMMANDS}, + {COMPLETE_CONDITION, COMPLETE_CONDITION}, + {COMPLETE_CONDITION, COMPLETE_CONDITION}, + {BRACE_GROUP, LINEBREAK}, + {BRACE_GROUP, TK_PAREN_OPEN}, + {BRACE_GROUP, TK_LBRACE}, + {BRACE_GROUP, COMPLETE_COMMANDS}, + {BRACE_GROUP, TK_BANG}, + {BRACE_GROUP, SEPARATOR_OP}, + {BRACE_GROUP, NEWLINE_LIST}, + {BRACE_GROUP, SEQUENCE}, +// watch ! + {FNAME, LINEBREAK}, + {FNAME, TK_PAREN_OPEN}, + {FNAME, TK_LBRACE}, + {FNAME, COMPLETE_COMMANDS}, + {FNAME, TK_BANG}, + {FNAME, SEPARATOR_OP}, + {FNAME, NEWLINE_LIST}, + {FNAME, SEQUENCE}, +// watch ! + {FUNCTION_BODY, FUNC}, + {FUNCTION_DEFINITION, LINEBREAK}, + {FUNCTION_DEFINITION, TK_PAREN_OPEN}, + {FUNCTION_DEFINITION, TK_LBRACE}, + {FUNCTION_DEFINITION, COMPLETE_COMMANDS}, + {FUNCTION_DEFINITION, TK_BANG}, + {FUNCTION_DEFINITION, SEPARATOR_OP}, + {FUNCTION_DEFINITION, NEWLINE_LIST}, + {FUNCTION_DEFINITION, SEQUENCE}, +// watch ! + {UNTIL_CLAUSE, LINEBREAK}, + {UNTIL_CLAUSE, TK_PAREN_OPEN}, + {UNTIL_CLAUSE, TK_LBRACE}, + {UNTIL_CLAUSE, COMPLETE_COMMANDS}, + {UNTIL_CLAUSE, TK_BANG}, + {UNTIL_CLAUSE, SEPARATOR_OP}, + {UNTIL_CLAUSE, NEWLINE_LIST}, + {UNTIL_CLAUSE, SEQUENCE}, + {UNTIL_CLAUSE, TK_DO}, + {UNTIL_CLAUSE, TK_PAREN_CLOSE}, + {UNTIL_CLAUSE, TK_WHILE}, + {UNTIL_CLAUSE, TK_UNTIL}, + {UNTIL_CLAUSE, TK_IF}, + {UNTIL_CLAUSE, TK_ELIF}, + {UNTIL_CLAUSE, TK_THEN}, + {UNTIL_CLAUSE, TK_ELSE}, + {UNTIL_CLAUSE, COMPOUND_LIST}, + {UNTIL_CLAUSE, CASE_LIST_NS}, + {UNTIL_CLAUSE, COMPLETE_CONDITION}, + {UNTIL_CLAUSE, AND_OR_MAJOR}, + {WHILE_CLAUSE, LINEBREAK}, + {WHILE_CLAUSE, COMPLETE_COMMANDS}, + {WHILE_CLAUSE, TK_BANG}, + {WHILE_CLAUSE, SEPARATOR_OP}, + {WHILE_CLAUSE, NEWLINE_LIST}, + {WHILE_CLAUSE, SEQUENCE}, +// watch ! + {WHILE_CLAUSE, TK_DO}, + {WHILE_CLAUSE, TK_PAREN_CLOSE}, + {WHILE_CLAUSE, TK_WHILE}, + {WHILE_CLAUSE, TK_UNTIL}, + {WHILE_CLAUSE, TK_IF}, + {WHILE_CLAUSE, TK_ELIF}, + {WHILE_CLAUSE, TK_THEN}, + {WHILE_CLAUSE, TK_ELSE}, + {WHILE_CLAUSE, COMPOUND_LIST}, + {WHILE_CLAUSE, CASE_LIST_NS}, + {WHILE_CLAUSE, COMPLETE_CONDITION}, + {WHILE_CLAUSE, AND_OR_MAJOR}, +// {ELSE_PART, COMPOUND_LIST}, +// {ELSE_PART, COMPLETE_CONDITION}, + {IF_CLAUSE, LINEBREAK}, + {IF_CLAUSE, TK_BANG}, + {IF_CLAUSE, TK_PAREN_OPEN}, + {IF_CLAUSE, TK_LBRACE}, + {IF_CLAUSE, COMPLETE_COMMANDS}, + {IF_CLAUSE, TK_BANG}, + {IF_CLAUSE, SEPARATOR_OP}, + {IF_CLAUSE, NEWLINE_LIST}, + {IF_CLAUSE, SEQUENCE}, +// watch ! + {IF_CLAUSE, TK_DO}, + {IF_CLAUSE, TK_PAREN_CLOSE}, + {IF_CLAUSE, TK_WHILE}, + {IF_CLAUSE, TK_UNTIL}, + {IF_CLAUSE, TK_IF}, + {IF_CLAUSE, TK_ELIF}, + {IF_CLAUSE, TK_THEN}, + {IF_CLAUSE, TK_ELSE}, + {IF_CLAUSE, COMPOUND_LIST}, + {IF_CLAUSE, CASE_LIST_NS}, + {IF_CLAUSE, COMPLETE_COMMAND}, + {IF_CLAUSE, COMPLETE_CONDITION}, + {IF_CLAUSE, AND_OR_MAJOR}, + {BRACE_CLAUSE, LINEBREAK}, + {BRACE_CLAUSE, TK_BANG}, + {BRACE_CLAUSE, TK_PAREN_OPEN}, + {BRACE_CLAUSE, TK_LBRACE}, + {BRACE_CLAUSE, COMPLETE_COMMANDS}, + {BRACE_CLAUSE, TK_BANG}, + {BRACE_CLAUSE, SEPARATOR_OP}, + {BRACE_CLAUSE, NEWLINE_LIST}, + {BRACE_CLAUSE, SEQUENCE}, +// watch ! + {BRACE_CLAUSE, TK_DO}, + {BRACE_CLAUSE, TK_PAREN_CLOSE}, + {BRACE_CLAUSE, TK_WHILE}, + {BRACE_CLAUSE, TK_UNTIL}, + {BRACE_CLAUSE, TK_IF}, + {BRACE_CLAUSE, TK_ELIF}, + {BRACE_CLAUSE, TK_THEN}, + {BRACE_CLAUSE, TK_ELSE}, + {BRACE_CLAUSE, COMPOUND_LIST}, + {BRACE_CLAUSE, CASE_LIST_NS}, + {BRACE_CLAUSE, COMPLETE_COMMAND}, + {BRACE_CLAUSE, COMPLETE_CONDITION}, + {BRACE_CLAUSE, AND_OR_MAJOR}, + {PATTERN, PATTERN_CASE}, + {PATTERN, CASE_LIST}, + {PATTERN, TK_IN}, + {CASE_LIST_NS, LINEBREAK}, + {CASE_LIST_NS, TK_IN}, + {CASE_CLAUSE, LINEBREAK}, + {CASE_CLAUSE, TK_BANG}, + {CASE_CLAUSE, TK_PAREN_OPEN}, + {CASE_CLAUSE, TK_LBRACE}, + {CASE_CLAUSE, COMPLETE_COMMANDS}, + {CASE_CLAUSE, TK_BANG}, + {CASE_CLAUSE, SEPARATOR_OP}, + {CASE_CLAUSE, NEWLINE_LIST}, + {CASE_CLAUSE, SEQUENCE}, +// watch ! + {CASE_CLAUSE, TK_PAREN_CLOSE}, + {CASE_CLAUSE, CASE_LIST_NS}, + {CASE_CLAUSE, TK_DO}, + {CASE_CLAUSE, TK_WHILE}, + {CASE_CLAUSE, TK_UNTIL}, + {CASE_CLAUSE, TK_IF}, + {CASE_CLAUSE, TK_ELIF}, + {CASE_CLAUSE, TK_THEN}, + {CASE_CLAUSE, TK_ELSE}, + {CASE_CLAUSE, COMPOUND_LIST}, + {CASE_CLAUSE, CASE_LIST_NS}, + {CASE_CLAUSE, COMPLETE_CONDITION}, + {CASE_CLAUSE, AND_OR_MAJOR}, + + {WORDLIST, IN}, + {IN, LINEBREAK}, + {NAME, TK_FOR}, + {FOR_WORDLIST, NAME}, + {FOR_CLAUSE, LINEBREAK}, + {FOR_CLAUSE, TK_BANG}, + {FOR_CLAUSE, TK_PAREN_OPEN}, + {FOR_CLAUSE, TK_LBRACE}, + {FOR_CLAUSE, COMPLETE_COMMANDS}, + {FOR_CLAUSE, SEPARATOR_OP}, + {FOR_CLAUSE, NEWLINE_LIST}, + {FOR_CLAUSE, SEQUENCE}, +// watch ! + {FOR_CLAUSE, TK_DO}, + {FOR_CLAUSE, TK_PAREN_CLOSE}, + {FOR_CLAUSE, TK_WHILE}, + {FOR_CLAUSE, TK_UNTIL}, + {FOR_CLAUSE, TK_IF}, + {FOR_CLAUSE, TK_ELIF}, + {FOR_CLAUSE, TK_THEN}, + {FOR_CLAUSE, TK_ELSE}, + {FOR_CLAUSE, COMPOUND_LIST}, + {FOR_CLAUSE, CASE_LIST_NS}, + {FOR_CLAUSE, COMPLETE_CONDITION}, + {FOR_CLAUSE, AND_OR_MAJOR}, + {COMPOUND_LIST, TK_DO}, + {COMPOUND_LIST, TK_PAREN_CLOSE}, + {COMPOUND_LIST, TK_LBRACE}, + {COMPOUND_LIST, TK_WHILE}, + {COMPOUND_LIST, TK_UNTIL}, + {COMPOUND_LIST, TK_ELIF}, + {COMPOUND_LIST, TK_ELSE}, + {COMPOUND_LIST, TK_IF}, + {COMPOUND_LIST, TK_THEN}, + {COMPOUND_LIST, TK_ELSE}, + {COMPOUND_LIST, COMPOUND_LIST}, + {COMPOUND_LIST, COMPLETE_CONDITION}, + {CLOSE_LIST, PATTERN}, + {CLOSE_LIST, FUNC_NAME}, + {SUBSHELL, LINEBREAK}, + {SUBSHELL, COMPLETE_COMMANDS}, + {SUBSHELL, TK_BANG}, + {SUBSHELL, SEPARATOR_OP}, + {SUBSHELL, NEWLINE_LIST}, + {SUBSHELL, SEQUENCE}, +// watch ! + {SUBSHELL, SEPARATOR_OP}, + {SUBSHELL, NEWLINE_LIST}, + {SUBSHELL, TK_DO}, + {SUBSHELL, TK_PAREN_CLOSE}, + {SUBSHELL, TK_WHILE}, + {SUBSHELL, TK_UNTIL}, + {SUBSHELL, TK_IF}, + {SUBSHELL, TK_ELIF}, + {SUBSHELL, TK_THEN}, + {SUBSHELL, TK_ELSE}, + {SUBSHELL, COMPOUND_LIST}, + {SUBSHELL, CASE_LIST_NS}, + {SUBSHELL, COMPLETE_CONDITION}, + {SUBSHELL, AND_OR_MAJOR}, + {COMPOUND_COMMAND, LINEBREAK}, + {COMPOUND_COMMAND, TK_PAREN_OPEN}, + {COMPOUND_COMMAND, TK_LBRACE}, + {COMPOUND_COMMAND, COMPLETE_COMMANDS}, + {COMPOUND_COMMAND, TK_BANG}, + {COMPOUND_COMMAND, SEPARATOR_OP}, + {COMPOUND_COMMAND, NEWLINE_LIST}, + {COMPOUND_COMMAND, SEQUENCE}, +// watch ! + {COMPOUND_COMMAND, FUNC}, + {COMPOUND_COMMAND, TK_DO}, + {COMPOUND_COMMAND, TK_PAREN_CLOSE}, + {COMPOUND_COMMAND, TK_WHILE}, + {COMPOUND_COMMAND, TK_UNTIL}, + {COMPOUND_COMMAND, TK_IF}, + {COMPOUND_COMMAND, TK_ELIF}, + {COMPOUND_COMMAND, TK_THEN}, + {COMPOUND_COMMAND, TK_ELSE}, + {COMPOUND_COMMAND, COMPOUND_LIST}, + {COMPOUND_COMMAND, CASE_LIST_NS}, + {COMPOUND_COMMAND, COMPLETE_CONDITION}, + {COMPOUND_COMMAND, AND_OR_MAJOR}, + {COMMAND, TK_WHILE}, + {COMMAND, TK_UNTIL}, + {COMMAND, LINEBREAK}, + {COMMAND, TK_BANG}, + {COMMAND, TK_PAREN_OPEN}, + {COMMAND, TK_LBRACE}, + {COMMAND, COMPLETE_COMMANDS}, + {COMMAND, TK_DO}, + {COMMAND, TK_PAREN_CLOSE}, + {COMMAND, TK_IF}, + {COMMAND, TK_ELIF}, + {COMMAND, TK_THEN}, + {COMMAND, TK_ELSE}, + {COMMAND, COMPOUND_LIST}, + {COMMAND, CASE_LIST_NS}, + {COMMAND, COMPLETE_CONDITION}, + {COMMAND, TK_BANG}, + {COMMAND, SEPARATOR_OP}, + {COMMAND, NEWLINE_LIST}, + {COMMAND, SEQUENCE}, + {COMMAND, AND_OR_MAJOR}, + {AND_OR_MINOR, SEQUENCE}, +// watch ! + {AND_OR_MINOR, LINEBREAK}, + {AND_OR_MINOR, TK_BANG}, + {AND_OR_MINOR, TK_PAREN_OPEN}, + {AND_OR_MINOR, TK_LBRACE}, + {AND_OR_MINOR, COMPLETE_COMMANDS}, + {AND_OR_MINOR, AND_OR_MAJOR}, + {PIPE_SEQUENCE, TK_WHILE}, + {PIPE_SEQUENCE, TK_UNTIL}, + {PIPE_SEQUENCE, TK_DO}, + {PIPE_SEQUENCE, TK_PAREN_CLOSE}, + {PIPE_SEQUENCE, TK_IF}, + {PIPE_SEQUENCE, TK_ELIF}, + {PIPE_SEQUENCE, TK_THEN}, + {PIPE_SEQUENCE, TK_ELSE}, + {PIPE_SEQUENCE, COMPOUND_LIST}, + {PIPE_SEQUENCE, CASE_LIST_NS}, + {PIPE_SEQUENCE, COMPLETE_CONDITION}, + {PIPE_SEQUENCE, LINEBREAK}, + {PIPE_SEQUENCE, TK_BANG}, + {PIPE_SEQUENCE, TK_PAREN_OPEN}, + {PIPE_SEQUENCE, TK_LBRACE}, + {PIPE_SEQUENCE, COMPLETE_COMMANDS}, + {PIPE_SEQUENCE, TK_BANG}, + {PIPE_SEQUENCE, TK_BANG}, + {PIPE_SEQUENCE, SEPARATOR_OP}, + {PIPE_SEQUENCE, NEWLINE_LIST}, + {PIPE_SEQUENCE, AND_OR_MAJOR}, + {TK_BANG, TK_WHILE}, + {TK_BANG, TK_UNTIL}, + {TK_BANG, TK_DO}, + {TK_BANG, TK_PAREN_CLOSE}, + {TK_BANG, TK_IF}, + {TK_BANG, TK_ELIF}, + {TK_BANG, TK_THEN}, + {TK_BANG, TK_ELSE}, + {TK_BANG, COMPOUND_LIST}, + {TK_BANG, CASE_LIST_NS}, + {TK_BANG, COMPLETE_CONDITION}, + {TK_BANG, LINEBREAK}, + {TK_BANG, TK_PAREN_OPEN}, + {TK_BANG, TK_LBRACE}, + {TK_BANG, COMPLETE_COMMANDS}, + {TK_BANG, TK_BANG}, + {TK_BANG, TK_BANG}, + {TK_BANG, SEPARATOR_OP}, + {TK_BANG, NEWLINE_LIST}, + {TK_BANG, AND_OR_MAJOR}, + {PIPE_SEMI_SEQUENCE, TK_WHILE}, + {PIPE_SEMI_SEQUENCE, TK_UNTIL}, + {PIPE_SEMI_SEQUENCE, TK_DO}, + {PIPE_SEMI_SEQUENCE, TK_PAREN_CLOSE}, + {PIPE_SEMI_SEQUENCE, TK_IF}, + {PIPE_SEMI_SEQUENCE, TK_ELIF}, + {PIPE_SEMI_SEQUENCE, TK_THEN}, + {PIPE_SEMI_SEQUENCE, TK_ELSE}, + {PIPE_SEMI_SEQUENCE, COMPOUND_LIST}, + {PIPE_SEMI_SEQUENCE, CASE_LIST_NS}, + {PIPE_SEMI_SEQUENCE, COMPLETE_CONDITION}, + {PIPE_SEMI_SEQUENCE, LINEBREAK}, + {PIPE_SEMI_SEQUENCE, TK_BANG}, + {PIPE_SEMI_SEQUENCE, TK_PAREN_OPEN}, + {PIPE_SEMI_SEQUENCE, TK_LBRACE}, + {PIPE_SEMI_SEQUENCE, COMPLETE_COMMANDS}, + {PIPE_SEMI_SEQUENCE, SEPARATOR_OP}, + {PIPE_SEMI_SEQUENCE, NEWLINE_LIST}, + {PIPE_SEMI_SEQUENCE, AND_OR_MAJOR}, + {SEQUENCE, PIPE_SEMI_SEQUENCE}, + {SEQUENCE, TK_WHILE}, + {SEQUENCE, TK_UNTIL}, + {SEQUENCE, TK_DO}, + {SEQUENCE, TK_PAREN_CLOSE}, + {SEQUENCE, TK_IF}, + {SEQUENCE, TK_ELIF}, + {SEQUENCE, TK_THEN}, + {SEQUENCE, TK_ELSE}, + {SEQUENCE, COMPOUND_LIST}, + {SEQUENCE, CASE_LIST_NS}, + {SEQUENCE, COMPLETE_CONDITION}, + {SEQUENCE, LINEBREAK}, + {SEQUENCE, TK_PAREN_OPEN}, + {SEQUENCE, TK_LBRACE}, + {SEQUENCE, COMPLETE_COMMANDS}, + {SEQUENCE, TK_BANG}, + {SEQUENCE, SEPARATOR_OP}, + {SEQUENCE, NEWLINE_LIST}, + {SEQUENCE, AND_OR_MAJOR}, + {SEQUENCE, SEQUENCE}, + {PIPELINE, TK_WHILE}, + {PIPELINE, TK_UNTIL}, + {PIPELINE, TK_DO}, + {PIPELINE, TK_PAREN_CLOSE}, + {PIPELINE, TK_IF}, + {PIPELINE, TK_ELIF}, + {PIPELINE, TK_THEN}, + {PIPELINE, TK_ELSE}, + {PIPELINE, COMPOUND_LIST}, + {PIPELINE, CASE_LIST_NS}, + {PIPELINE, COMPLETE_CONDITION}, + {PIPELINE, LINEBREAK}, + {PIPELINE, TK_BANG}, + {PIPELINE, TK_PAREN_OPEN}, + {PIPELINE, TK_LBRACE}, + {PIPELINE, COMPLETE_COMMANDS}, + {PIPELINE, SEPARATOR_OP}, + {PIPELINE, SEPARATOR_OP}, + {PIPELINE, NEWLINE_LIST}, + {PIPELINE, AND_OR_MAJOR}, + {AND_OR_MAJOR, LINEBREAK}, + {AND_OR_MAJOR, TK_BANG}, + {AND_OR_MAJOR, TK_PAREN_OPEN}, + {AND_OR_MAJOR, TK_LBRACE}, + {AND_OR_MAJOR, COMPLETE_COMMANDS}, + {AND_OR_MAJOR, AND_OR_MAJOR}, + {AND_OR_MAJOR, AND_OR_MAJOR}, + {AND_OR, TK_DO}, + {AND_OR, TK_PAREN_CLOSE}, + {AND_OR, TK_WHILE}, + {AND_OR, TK_UNTIL}, + {AND_OR, TK_IF}, + {AND_OR, TK_ELIF}, + {AND_OR, TK_THEN}, + {AND_OR, TK_ELSE}, + {AND_OR, COMPOUND_LIST}, + {AND_OR, CASE_LIST_NS}, + {AND_OR, COMPLETE_CONDITION}, + {AND_OR, LINEBREAK}, + {AND_OR, TK_BANG}, + {AND_OR, TK_PAREN_OPEN}, + {AND_OR, TK_LBRACE}, + {AND_OR, COMPLETE_COMMANDS}, + {AND_OR, SEPARATOR_OP}, + {AND_OR, SEPARATOR_OP}, + {AND_OR, NEWLINE_LIST}, + {LIST, LINEBREAK}, + {LIST, COMPLETE_COMMANDS}, + {LIST, NEWLINE_LIST}, + {COMPLETE_COMMAND, LINEBREAK}, + {COMPLETE_COMMAND, COMPLETE_COMMANDS}, + {COMPLETE_COMMAND, NEWLINE_LIST}, + {COMPLETE_COMMANDS, COMPLETE_COMMANDS}, + {PROGRAM, TERMINUS}, + {0, 0}, +}; + +int eval_sym(t_list **stack, t_sym new_sym) +{ + t_sym *head; + int i; + + if (!*stack) + return (1); + head = (*stack)->content; +// DG("eval head %s && sym %s", read_state(*head), read_state(new_sym)); + i = 0; + while (g_stackmatch[i].top) + { + if (new_sym == g_stackmatch[i].top && *head == g_stackmatch[i].under) + return (0); + i++; + } + return (1); +} diff --git a/42sh/src/parser/ft_parse.c b/42sh/src/parser/ft_parse.c index 24eebe40..c949eb17 100644 --- a/42sh/src/parser/ft_parse.c +++ b/42sh/src/parser/ft_parse.c @@ -3,46 +3,65 @@ /* ::: :::::::: */ /* ft_parse.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ +/* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 17:14:58 by jhalford #+# #+# */ -/* Updated: 2017/02/06 14:38:56 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ -#include "parser.h" +#include "minishell.h" -t_parser g_parser[] = +static void insert_linebreak(t_list **lst) { - {TK_SEMI, &parse_separator}, - {TK_AND_IF | TK_OR_IF, &parse_separator}, - {TK_AMP, &parse_separator}, - {TK_PIPE, &parse_separator}, - {TK_REDIR, &parse_redir}, - {TK_SUBSHELL, &parse_subshell}, - {TK_WORD, &parse_word}, - {0, 0}, -}; + t_token *token; + + token = (*lst)->content; + token->type = LINEBREAK; +} -int ft_parse(t_btree **ast, t_list **start) +static int end_instruction(t_list **stack) { - t_list *lst; - t_astnode item; - int i; - - i = 0; - if (!*start) - return (0); - if (!*ast) - { - *ast = btree_create_node(&item, sizeof(item)); - ((t_astnode *)(*ast)->item)->data.token = NULL; - } - while (g_parser[i].type) - { - if ((lst = ft_lst_find(*start, &g_parser[i].type, &token_cmp_type))) - return ((*g_parser[i].f)(ast, start, &lst)); - i++; - } + t_sym *head; + + head = (*stack)->content; + if (*head == CMD_SUPERIOR || *head == PIPE_SEMI_SEQUENCE + || *head == COMPLETE_COMMANDS || *head == END_COMMAND) + return (1); + return (0); +} + +int ft_parse(t_btree **ast, t_list **token, t_parser *parser) +{ + t_sym *head; + + if (pop_heredoc(&parser->heredoc_queue, token)) + return (0); + while (*token) + { + produce_sym(&parser->stack, parser->new_sym, token); + DG("new sym %s", read_state(*parser->new_sym)); + if (eval_sym(&parser->stack, *parser->new_sym)) + return ((parser->state = ERROR)); + else + { + if (aggregate_sym(&parser->stack, parser->new_sym, &parser->state)) + return (0); + push_stack(&parser->stack, *parser->new_sym); + } +// ft_read_stack(parser->stack); + DG("\n"); + if (*(head = (parser->stack)->content) == PROGRAM) + parser->state = SUCCESS; + else + parser->state = UNDEFINED; + build_tree(ast, token); +// btree_print(STDBUG, *ast, &ft_putast); + if ((end_instruction(&parser->stack) && !(*token)->next)) + insert_linebreak(token); + else + ft_lst_delif(token, (*token)->content, &ft_addrcmp, &token_free); + } + if (parser->state == SUCCESS) + DG("sucessful parsing"); return (0); } diff --git a/42sh/src/parser/heredoc_parser.c b/42sh/src/parser/heredoc_parser.c new file mode 100644 index 00000000..e76b7791 --- /dev/null +++ b/42sh/src/parser/heredoc_parser.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* heredoc_parser.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/08 16:21:05 by ariard #+# #+# */ +/* Updated: 2017/03/08 23:18:29 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int pop_heredoc(t_list **heredoc_queue, t_list **lst) +{ + t_token *token; + t_list *temp; + t_list *temp2; + t_redir *head; + + temp = NULL; + if (!heredoc_queue && !*heredoc_queue) + return (0); + token = (*lst)->content; + if (token->type == HEREDOCDATA) + { + head = data_singleton()->heredoc_queue->content; + temp = data_singleton()->heredoc_queue; + DG("compare %s with %s", (char *)token->data, head->word); + if (head && ft_strcmp((char *)token->data, head->word) == 0) + { + temp2 = temp->next; + free(temp); + data_singleton()->heredoc_queue = temp2; + } + else + head->heredoc_data = ft_strjoin(head->heredoc_data, token->data); + ft_lstdel(lst, &token_free); + return (1); + } + return (0); +} diff --git a/42sh/src/parser/parse_dgreat.c b/42sh/src/parser/parse_dgreat.c deleted file mode 100644 index df19624b..00000000 --- a/42sh/src/parser/parse_dgreat.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_dgreat.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2017/02/06 16:28:15 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_dgreat(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *tok; - t_token *next_tok; - - node = (*ast)->item; - node->type = TK_DGREAT; - if (!(*lst)->next) - return (1); - tok = (*lst)->content; - next_tok = (*lst)->next->content; - if (!(next_tok->type & TK_WORD)) - return (1); - node->data.redir.n = ft_atoi(tok->data); - node->data.redir.word.word = ft_strdup(next_tok->data); - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - ft_lst_delif(start, (*lst)->next->content, &ft_addrcmp, &token_free); - ft_parse(&(*ast)->left, start); - return (0); -} diff --git a/42sh/src/parser/parse_dless.c b/42sh/src/parser/parse_dless.c deleted file mode 100644 index 1b75baa2..00000000 --- a/42sh/src/parser/parse_dless.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_dless.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/12/03 13:31:40 by jhalford #+# #+# */ -/* Updated: 2017/02/06 16:28:08 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_dless(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *tok; - t_token *next_tok; - - node = (*ast)->item; - node->type = TK_DLESS; - if (!(*lst)->next) - return (1); - tok = (*lst)->content; - next_tok = (*lst)->next->content; - if (next_tok->type != TK_WORD) - return (1); - node->data.redir.word.word = ft_strdup(tok->data); - node->data.redir.n = 0; - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - ft_lst_delif(start, (*lst)->next->content, &ft_addrcmp, &token_free); - ft_parse(&(*ast)->left, start); - return (0); -} diff --git a/42sh/src/parser/parse_great.c b/42sh/src/parser/parse_great.c deleted file mode 100644 index 7fbc3110..00000000 --- a/42sh/src/parser/parse_great.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_great.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2017/02/07 15:26:25 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_great(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *tok; - t_token *next_tok; - - node = (*ast)->item; - node->type = TK_GREAT; - if (!(*lst)->next) - return (1); - tok = (*lst)->content; - next_tok = (*lst)->next->content; - if (!(next_tok->type & TK_WORD)) - return (1); - node->data.redir.n = *tok->data == '>' ? 1 : ft_atoi(tok->data); - node->data.redir.word.word = ft_strdup(next_tok->data); - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - ft_lst_delif(start, (*lst)->next->content, &ft_addrcmp, &token_free); - ft_parse(&(*ast)->left, start); - return (0); -} diff --git a/42sh/src/parser/parse_greatand.c b/42sh/src/parser/parse_greatand.c deleted file mode 100644 index 3950072f..00000000 --- a/42sh/src/parser/parse_greatand.c +++ /dev/null @@ -1,32 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_greatand.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2017/02/07 15:32:44 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_greatand(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *tok; - char *and; - - node = (*ast)->item; - node->type = TK_GREATAND; - tok = (*lst)->content; - and = ft_strchr(tok->data, '&'); - node->data.redir.n = *tok->data == '>' ? 1 : ft_atoi(tok->data); - node->data.redir.word.fd = ft_atoi(and + 1); - node->data.redir.close = - tok->data[ft_strlen(tok->data) - 1] == '-' ? 1 : 0; - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - ft_parse(&(*ast)->left, start); - return (0); -} diff --git a/42sh/src/parser/parse_less.c b/42sh/src/parser/parse_less.c deleted file mode 100644 index 53e47790..00000000 --- a/42sh/src/parser/parse_less.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_less.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2017/02/06 16:31:19 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_less(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *tok; - t_token *next_tok; - - node = (*ast)->item; - node->type = TK_LESS; - if (!(*lst)->next) - return (1); - tok = (*lst)->content; - next_tok = (*lst)->next->content; - if (!(next_tok->type & TK_WORD)) - return (1); - node->data.redir.n = *tok->data == '>' ? 0 : ft_atoi(tok->data); - node->data.redir.word.word = ft_strdup(next_tok->data); - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - ft_lst_delif(start, (*lst)->next->content, &ft_addrcmp, &token_free); - ft_parse(&(*ast)->left, start); - return (0); -} diff --git a/42sh/src/parser/parse_lessand.c b/42sh/src/parser/parse_lessand.c deleted file mode 100644 index 77e17890..00000000 --- a/42sh/src/parser/parse_lessand.c +++ /dev/null @@ -1,32 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_lessand.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2017/02/06 16:30:37 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_lessand(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *tok; - char *and; - - node = (*ast)->item; - node->type = TK_LESSAND; - tok = (*lst)->content; - and = ft_strchr(tok->data, '&'); - node->data.redir.n = *tok->data == '<' ? 0 : ft_atoi(tok->data); - node->data.redir.word.fd = ft_atoi(and + 1); - node->data.redir.close = - tok->data[ft_strlen(tok->data) - 1] == '-' ? 1 : 0; - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - ft_parse(&(*ast)->left, start); - return (0); -} diff --git a/42sh/src/parser/parse_redir.c b/42sh/src/parser/parse_redir.c deleted file mode 100644 index 4d209f62..00000000 --- a/42sh/src/parser/parse_redir.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_redir.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/02 18:58:27 by jhalford #+# #+# */ -/* Updated: 2017/02/06 16:07:08 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_redir(t_btree **ast, t_list **start, t_list **lst) -{ - t_token *tok; - - tok = (*lst)->content; - if (tok->type == TK_LESS) - return (parse_less(ast, start, lst)); - else if (tok->type == TK_GREAT) - return (parse_great(ast, start, lst)); - else if (tok->type == TK_DLESS) - return (parse_dless(ast, start, lst)); - else if (tok->type == TK_DGREAT) - return (parse_dgreat(ast, start, lst)); - else if (tok->type == TK_LESSAND) - return (parse_lessand(ast, start, lst)); - else if (tok->type == TK_GREATAND) - return (parse_greatand(ast, start, lst)); - else - return (-42); -} diff --git a/42sh/src/parser/parse_subshell.c b/42sh/src/parser/parse_subshell.c deleted file mode 100644 index eff75a54..00000000 --- a/42sh/src/parser/parse_subshell.c +++ /dev/null @@ -1,37 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_subshell.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/01/11 16:52:44 by jhalford #+# #+# */ -/* Updated: 2017/02/06 14:42:08 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_subshell(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *token; - - (void)start; - token = (*lst)->content; - if ((*lst)->next && ((t_token*)(*lst)->next->content)->type & TK_WORD) - { - ft_dprintf(2, "{red}%s: parse error near ')'{eoc}\n", SHELL_NAME); - return (-1); - } - node = (*ast)->item; - node->type = TK_SUBSHELL; - node->data.sstr = malloc(4 * sizeof(char *)); - node->data.sstr[0] = ft_strdup(data_singleton()->argv[0]); - node->data.sstr[1] = ft_strdup("-c"); - node->data.sstr[2] = ft_strdup(token->data); - node->data.sstr[3] = NULL; - ft_parse(ast, &(*lst)->next); - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - return (0); -} diff --git a/42sh/src/parser/parse_word.c b/42sh/src/parser/parse_word.c deleted file mode 100644 index e4faa7aa..00000000 --- a/42sh/src/parser/parse_word.c +++ /dev/null @@ -1,36 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* parse_word.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */ -/* Updated: 2017/02/07 17:39:36 by wescande ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "parser.h" - -int parse_word(t_btree **ast, t_list **start, t_list **lst) -{ - t_astnode *node; - t_token *token; - char **the_tab; - - (void)start; - token = (*lst)->content; - node = (*ast)->item; - node->type = TK_COMMAND; - if ((the_tab = (char **)malloc(sizeof(char *) * 4))) - { - the_tab[0] = ft_strdup(token->data); - the_tab[1] = (char *)dup_char_esc(token->esc, token->size >> 3); - the_tab[2] = (char *)dup_char_esc(token->esc2, token->size >> 3); - the_tab[3] = NULL; - } - ft_ld_pushback(&node->data.token, the_tab); - ft_parse(ast, &(*lst)->next); - ft_lst_delif(start, (*lst)->content, &ft_addrcmp, &token_free); - return (0); -} diff --git a/42sh/src/parser/parser_init.c b/42sh/src/parser/parser_init.c new file mode 100644 index 00000000..7e599c4f --- /dev/null +++ b/42sh/src/parser/parser_init.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_init.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/21 16:14:04 by ariard #+# #+# */ +/* Updated: 2017/03/08 21:56:56 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void parser_init(t_parser *parser) +{ + parser->state = SUCCESS; + parser->new_sym = ft_memalloc(sizeof(t_sym)); + parser->stack = NULL; + push_stack(&parser->stack, TERMINUS); + push_stack(&parser->stack, LINEBREAK); + parser->heredoc_queue = NULL; +} diff --git a/42sh/src/parser/pop_stack.c b/42sh/src/parser/pop_stack.c new file mode 100644 index 00000000..dca7b2f1 --- /dev/null +++ b/42sh/src/parser/pop_stack.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pop_stack.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 19:12:44 by ariard #+# #+# */ +/* Updated: 2017/03/07 15:09:32 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int pop_stack(t_list **stack, t_sym erase_sym) +{ + t_sym *head; + t_list *temp; + + while ((*stack) && (*(head = (*stack)->content) != erase_sym + && *head != TERMINUS)) + { + temp = *stack; + (*stack) = (*stack)->next; + ft_lstdelone(&temp, NULL); + } + if ((*stack) && *(head = (*stack)->content) != TERMINUS) + { + temp = *stack; + (*stack) = (*stack)->next; + ft_lstdelone(&temp, NULL); + } + else + return (1); + return (0); +} diff --git a/42sh/src/parser/produce_sym.c b/42sh/src/parser/produce_sym.c new file mode 100644 index 00000000..a4d17984 --- /dev/null +++ b/42sh/src/parser/produce_sym.c @@ -0,0 +1,139 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* produce_sym.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 17:58:34 by ariard #+# #+# */ +/* Updated: 2017/03/08 18:00:22 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_prodmatch g_prodmatch[] = +{ + {TK_WORD, TK_DLESS, HERE_END}, + {TK_WORD, TK_DLESSDASH, HERE_END}, + {TK_WORD, TK_LESS, FILENAME}, + {TK_WORD, TK_LESSAND, FILENAME}, + {TK_WORD, TK_GREAT, FILENAME}, + {TK_WORD, TK_GREATAND, FILENAME}, + {TK_WORD, TK_DGREAT, FILENAME}, + {TK_WORD, TK_LESSGREAT, FILENAME}, + {TK_WORD, TK_CLOBBER, FILENAME}, + {TK_WORD, CMD_WORD, CMD_SUFFIX}, + {TK_WORD, CMD_NAME, CMD_SUFFIX}, + {TK_WORD, CMD_SUPERIOR, CMD_SUFFIX}, + {TK_WORD, PIPE_SEMI_SEQUENCE, CMD_SUFFIX}, + {TK_WORD, LINEBREAK, CMD_NAME}, + {TK_WORD, TK_BANG, CMD_NAME}, + {TK_WORD, TK_PIPE, CMD_NAME}, + {TK_WORD, AND_OR, CMD_NAME}, + {TK_WORD, AND_OR_MAJOR, CMD_NAME}, + {TK_WORD, TK_WHILE, CMD_NAME}, + {TK_WORD, TK_UNTIL, CMD_NAME}, + {TK_WORD, TK_DO, CMD_NAME}, + {TK_WORD, TK_PAREN_CLOSE, CMD_NAME}, + {TK_WORD, TK_RBRACE, CMD_NAME}, + {TK_WORD, TK_IF, CMD_NAME}, + {TK_WORD, TK_THEN, CMD_NAME}, + {TK_WORD, TK_ELIF, CMD_NAME}, + {TK_WORD, TK_ELSE, CMD_NAME}, + {TK_WORD, COMPOUND_LIST, CMD_NAME}, + {TK_WORD, CASE_LIST_NS, CMD_NAME}, + {TK_WORD, COMPLETE_CONDITION, CMD_NAME}, + {TK_WORD, NEWLINE_LIST, CMD_NAME}, + {TK_WORD, TK_BANG, CMD_NAME}, + {TK_WORD, SEQUENCE, CMD_NAME}, + {TK_WORD, SEPARATOR_OP, CMD_NAME}, + {TK_WORD, TK_PAREN_OPEN, CMD_NAME}, + {TK_WORD, TK_LBRACE, CMD_NAME}, + {TK_WORD, CASE_LIST, PATTERN}, + {TK_WORD, PATTERN_CASE, PATTERN}, + {TK_WORD, COMPLETE_COMMANDS, CMD_NAME}, + {TK_ASSIGNEMENT_WORD, TK_BANG, CMD_PREFIX}, + {TK_ASSIGNEMENT_WORD, LINEBREAK, CMD_PREFIX}, + {TK_ASSIGNEMENT_WORD, TK_PAREN_OPEN, CMD_PREFIX}, + {TK_ASSIGNEMENT_WORD, TK_LBRACE, CMD_PREFIX}, + {TK_ASSIGNEMENT_WORD, TK_BANG, CMD_PREFIX}, + {TK_ASSIGNEMENT_WORD, SEPARATOR_OP, CMD_PREFIX}, + {TK_ASSIGNEMENT_WORD, NEWLINE_LIST, CMD_PREFIX}, + {TK_NAME, TK_BANG, FNAME}, + {TK_NAME, LINEBREAK, FNAME}, + {TK_NAME, TK_PAREN_OPEN, FNAME}, + {TK_NAME, TK_LBRACE, FNAME}, + {TK_NAME, TK_BANG, FNAME}, + {TK_NAME, SEPARATOR_OP, FNAME}, + {TK_NAME, NEWLINE_LIST, FNAME}, + {TK_NAME, TK_FOR, NAME}, + {TK_NEWLINE, MATH_SUP, NEWLINE_LIST}, + {TK_NEWLINE, CASE_LIST_NS, NEWLINE_LIST}, + {TK_NEWLINE, TK_DO, NEWLINE_LIST}, + {TK_NEWLINE, TK_PAREN_CLOSE, NEWLINE_LIST}, + {TK_NEWLINE, TK_RBRACE, CMD_NAME}, + {TK_NEWLINE, TK_IN, NEWLINE_LIST}, + {TK_NEWLINE, TK_WHILE, NEWLINE_LIST}, + {TK_NEWLINE, TK_UNTIL, NEWLINE_LIST}, + {TK_NEWLINE, TK_IF, NEWLINE_LIST}, + {TK_NEWLINE, TK_FI, NEWLINE_LIST}, + {TK_NEWLINE, TK_ELIF, NEWLINE_LIST}, + {TK_NEWLINE, TK_ELSE, NEWLINE_LIST}, + {TK_NEWLINE, TK_THEN, NEWLINE_LIST}, + {TK_NEWLINE, CMD_NAME, NEWLINE_LIST}, + {TK_NEWLINE, COMPLETE_COMMANDS, NEWLINE_LIST}, + {TK_NEWLINE, LINEBREAK, NEWLINE_LIST}, + {TK_NEWLINE, TK_BANG, NEWLINE_LIST}, + {TK_NEWLINE, TK_PAREN_OPEN, NEWLINE_LIST}, + {TK_NEWLINE, TK_LBRACE, NEWLINE_LIST}, + {TK_NEWLINE, CMD_SUPERIOR, LINEBREAK}, + {TK_NEWLINE, PIPE_SEMI_SEQUENCE, LINEBREAK}, + {TK_NEWLINE, SEQUENCE, LINEBREAK}, + {TK_NEWLINE, CASE_LIST_NS, NEWLINE_LIST}, + {TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST}, + {TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST}, + {TK_NEWLINE, CONDITION, NEWLINE_LIST}, + {TK_NEWLINE, FOR_WORDLIST, NEWLINE_LIST}, + {TK_NEWLINE, SEQUENTIAL_SEP, NEWLINE_LIST}, + {TK_NEWLINE, PROGRAM, NEWLINE_LIST}, + {TK_SEMI, MATH_SUP, SEPARATOR_OP}, + {TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP}, + {TK_SEMI, LIST, SEPARATOR_OP}, + {TK_SEMI, PIPE_SEMI_SEQUENCE, SEPARATOR_OP}, + {TK_AMP, MATH_SUP, SEPARATOR_OP}, + {TK_AMP, CMD_SUPERIOR, SEPARATOR_OP}, + {TK_AMP, LIST, SEPARATOR_OP}, + {TK_AMP, PIPE_SEMI_SEQUENCE, SEPARATOR_OP}, + + {0, 0, 0}, +}; + +int produce_sym(t_list **stack, t_sym *new_sym, t_list **lst) +{ + t_token *token; + t_sym *head; + int i; + + if (!*stack || !*lst) + return (1); + token = (*lst)->content; + head = (*stack)->content; +// DG("produce stack : %s && token : %s", read_state(*head), +// read_state(token->type)); + i = 0; + *new_sym = 0; + while (g_prodmatch[i].new_sym) + { + if (token->type == g_prodmatch[i].token + && *head == g_prodmatch[i].stack) + { +// DG("MATCH : %s", read_state(g_prodmatch[i].new_sym)); + *new_sym = g_prodmatch[i].new_sym; + } + i++; + } + if (!*new_sym) + *new_sym = token->type; + return (0); +} diff --git a/42sh/src/parser/push_stack.c b/42sh/src/parser/push_stack.c new file mode 100644 index 00000000..1f2ba51e --- /dev/null +++ b/42sh/src/parser/push_stack.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* push_stack.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 16:48:30 by ariard #+# #+# */ +/* Updated: 2017/03/03 14:28:09 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +//int push_stack(t_sym *stack, t_sym new_sym) +int push_stack(t_list **stack, t_sym sym) +{ + ft_lstadd(stack, ft_lstnew(&sym, sizeof(sym))); +// *stack = sym; + return (0); +} diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c new file mode 100644 index 00000000..0e272f80 --- /dev/null +++ b/42sh/src/parser/read_stack.c @@ -0,0 +1,218 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* read_stack.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/09 15:32:10 by ariard #+# #+# */ +/* Updated: 2017/03/08 17:39:50 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *read_state(t_sym current) +{ + if (current == HEREDOCDATA) + return ("HEREDOCDATA"); + if (current == TERMINUS) + return ("TERMINUS"); + if (current == SEQUENCE) + return ("SEQUENCE"); + if (current == LINEBREAK) + return ("LINEBREAK"); + if (current == CLOSE_LIST) + return ("CLOSE_LIST"); + if (current == BRACE_CLAUSE) + return ("BRACE_CLAUSE"); + if (current == FUNC_NAME) + return ("FUNC_NAME"); + if (current == TK_LBRACE) + return ("TK_LBRACE"); + if (current == TK_RBRACE) + return ("TK_RBRACE"); + if (current == TK_ASSIGNEMENT_WORD) + return ("TK_ASSIGNEMENT_WORD"); + if (current == CASE_CLAUSE) + return ("CASE_CLAUSE"); + if (current == CASE_LIST_NS) + return ("CASE_LIST_NS"); + if (current == TK_DSEMI) + return ("TK_DSEMI"); + if (current == TK_PAREN_OPEN) + return ("TK_PAREN_OPEN"); + if (current == TK_PAREN_CLOSE) + return ("TK_PAREN_CLOSE"); + if (current == FOR_WORDLIST) + return ("FOR_WORDLIST"); + if (current == FOR_CLAUSE) + return ("FOR_CLAUSE"); + if (current == TK_NAME) + return ("TK_NAME"); + if (current == TK_FOR) + return ("FOR"); + if (current == NAME) + return ("NAME"); + if (current == 0) + return ("NULL"); + if (current == PATTERN) + return ("PATTERN"); + if (current == TK_CASE) + return ("TK_CASE"); + if (current == TK_IN) + return ("TK_IN"); + if (current == TK_ESAC) + return ("TK_ESAC"); + if (current == UNTIL_CLAUSE) + return ("UNTIL_CLAUSE"); + if (current == TK_UNTIL) + return ("TK_UNTIL"); + if (current == IF_CLAUSE) + return ("IF_CLAUSE"); + if (current == CONDITION) + return ("CONDITION"); + if (current == COMPLETE_CONDITION) + return ("COMPLETE_CONDITION"); + if (current == TK_ELSE) + return ("TK_ELSE"); + if (current == TK_FI) + return ("TK_FI"); + if (current == ELSE_PART) + return ("ELSE_PART"); + if (current == TK_FI) + return ("TK_FI"); + if (current == TK_IF) + return ("TK_IF"); + if (current == TK_ELIF) + return ("TK_ELIF"); + if (current == TK_THEN) + return ("TK_THEN"); + if (current == COMPOUND_COMMAND) + return ("COMPOUND_COMMAND"); + if (current == WHILE_CLAUSE) + return ("WHILE_CLAUSE"); + if (current == LOOP) + return ("LOOP"); + if (current == TK_DONE) + return ("DONE"); + if (current == TK_DO) + return ("TK_DO"); + if (current == END_COMMAND) + return ("END_COMMAND"); + if (current == SEQUENTIAL_SEP) + return ("SEQUENTIAL_SEP"); + if (current == SEPARATOR) + return ("SEPARATOR"); + if (current == SEPARATOR_OP) + return ("SEPARATOR_OP"); + if (current == TERM) + return ("TERM"); + if (current == COMPOUND_LIST) + return ("COMPOUND_LIST"); + if (current == DO_GROUP) + return ("DO_GROUP"); + if (current == TK_NEWLINE) + return ("TK_NEWLINE"); + if (current == TK_WHILE) + return ("TK_WHILE"); + if (current == TK_DO) + return ("TK_DO"); + if (current == TK_DONE) + return ("TK_DONE"); + if (current == AND_OR_MINOR) + return("AND_OR_MINOR"); + if (current == AND_OR_MAJOR) + return ("AND_OR_MAJOR"); + if (current == TK_COMMAND) + return ("TK_COMMAND"); + if (current == TK_AND_IF) + return ("TK_AND_IF"); + if (current == TK_OR_IF) + return ("TK_OR_IF"); + if (current == TK_AMP) + return ("TK_AMP"); + if (current == TK_PIPE) + return ("TK_PIPE"); + if (current == TK_LESS) + return ("TK_LESS"); + if (current == TK_GREAT) + return ("TK_GREAT"); + if (current == TK_DLESS) + return ("TK_DLESS"); + if (current == TK_DGREAT) + return ("TK_DGREAT"); + if (current == TK_DGREAT) + return ("TK_DGREAT"); + if (current == TK_LESSAND) + return ("TK_LESSAND"); + if (current == TK_GREATAND) + return ("TK_GREATAND"); + if (current == SUBSHELL) + return ("SUBSEHLL"); + if (current == CMD_SUPERIOR) + return ("CMD_SUPERIOR"); + if (current == TK_IO_NUMBER) + return ("IO_NUMBER"); + if (current == CMD_SUFFIX) + return ("CMD_SUFFIX"); + if (current == CMD_PREFIX) + return ("CMD_PREFIX"); + if (current == IO_REDIRECT) + return ("IO_REDIRECT"); + if (current == IO_FILE) + return ("IO_FILE"); + if (current == PIPE_SEMI_SEQUENCE) + return ("PIPE_SEMI_SEQUENCE"); + if (current == TK_PIPE) + return ("TK_PIPE"); + if (current == PROGRAM) + return ("PROGRAM"); + if (current == COMMAND) + return ("COMMAND"); + if (current == PIPE_SEQUENCE) + return ("PIPE_SEQUENCE"); + if (current == PIPELINE) + return ("PIPELINE"); + if (current == AND_OR) + return ("AND_OR"); + if (current == LIST) + return ("LIST"); + if (current == COMPLETE_COMMAND) + return ("COMPLETE_COMMAND"); + if (current == COMPLETE_COMMANDS) + return ("COMPLETE_COMMANDS"); + if (current == TK_WORD) + return ("TK_WORD"); + if (current == CMD_NAME) + return ("CMD_NAME"); + if (current == HERE_END) + return ("HERE_END"); + if (current == FILENAME) + return ("FILENAME"); + if (current == CMD_SUFFIX) + return ("CMD_SUFFIX"); + if (current == SIMPLE_COMMAND) + return ("SIMPLE_COMMAND"); + if (current == TK_SEMI) + return ("TK_SEMI"); + if (current == ALL) + return ("ALL"); + if (current == NEWLINE_LIST) + return ("NEWLINE_LIST"); + if (current == CMD) + return ("CMD"); + if (current != 0) + return ("NON-DEFINED"); + if (current == 0) + return ("NULL"); + return ("NULL"); +} + +int ft_read_stack(t_sym *stack) +{ + DG("read stack :"); + while (*stack) + DG("%s", read_state(*stack--)); + return (0); +} diff --git a/42sh/src/parser/tree_wrapper.c b/42sh/src/parser/tree_wrapper.c new file mode 100644 index 00000000..c57cc34a --- /dev/null +++ b/42sh/src/parser/tree_wrapper.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tree_wrapper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/15 18:57:44 by ariard #+# #+# */ +/* Updated: 2017/03/08 00:02:46 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int join_ast(t_btree **ast, t_btree **new_node) +{ + (*new_node)->left = *ast; + *ast = *new_node; + return (0); +} + +int gen_node(t_btree **ast) +{ + t_astnode item; + + if (!*ast) + { + *ast = btree_create_node(&item, sizeof(item)); + ft_bzero((void *)&((t_astnode *)(*ast)->item)->data, sizeof(t_astdata)); + ((t_astnode *)(*ast)->item)->nest = 0; + ((t_astnode *)(*ast)->item)->full = 0; + ((t_astnode *)(*ast)->item)->type = TK_NEWLINE; + ((t_astnode *)(*ast)->item)->pattern = 0; + } + return (0); +} + +int isnull(t_btree **ast, t_list **lst) +{ + (void)ast; + (void)lst; + return (-1); +} + +int add_null(t_btree **ast, t_list **lst) +{ + (void)ast; + (void)lst; + return (-1); +} + diff --git a/42sh/test_framework.sh b/42sh/test_framework.sh new file mode 100755 index 00000000..eb97fe43 --- /dev/null +++ b/42sh/test_framework.sh @@ -0,0 +1,41 @@ +SHELL=$1 +TOTAL_TEST=0 +NBR_TEST_SUCCESS=0 +unset LIST_TEST +LIST_TEST='./TESTSHELL/*'/'*'.test +DIR_TEST=./TESTSHELL + +do_test() { + +for TEST in $LIST_TEST +do + + ($SHELL < $TEST 1> ${DIR_TEST}/stdin_test 2> ${DIR_TEST}/stderr_test) + (bash < $TEST 1> ${DIR_TEST}/stdin_ref 2> ${DIR_TEST}/stderr_ref) + + if ! diff ${DIR_TEST}/stdin_test ${DIR_TEST}/stdin_ref > /dev/null || + ! diff ${DIR_TEST}/stderr_test ${DIR_TEST}/stderr_test > /dev/null + then + echo "\033[0;31mFAILURE $TEST" >> ${DIR_TEST}/resultat + else + ((NBR_TEST_SUCCESS++)) + fi + ((TOTAL_TEST++)) +done +} + +do_test + +if [ -e ${DIR_TEST}/resultat ] +then + cat ${DIR_TEST}/resultat +fi +echo "\033[0;32mYou succeed $NBR_TEST_SUCCESS tests on $TOTAL_TEST" + +rm -f $DIR_TEST/resultat + +#add random input sed -n $RANDOM "p" /usr/share/dict/words +#add timeout +#charging phase of test +#real verification of references +#to add extranous comportement