diff --git a/42sh/Makefile b/42sh/Makefile index 883ac512..4f14983a 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/24 14:53:07 by ariard ### ########.fr # +# Updated: 2017/03/24 23:52:56 by ariard ### ########.fr # # # # **************************************************************************** # diff --git a/42sh/VAR b/42sh/VAR deleted file mode 100644 index 7813ba73..00000000 --- a/42sh/VAR +++ /dev/null @@ -1,23 +0,0 @@ -$TOKEN201703241737_NAME -21sh_error -42ShellTester -42sh -42sh_error -Makefile -README.md -STDBUG -VAR -auteur -donovan_segaults_06-02 -file -includes -libft -minishell_error -new_file -objs -pdf -sample -scriptheader.sh -src -update_makefile.sh -write_on_stdout_and_stderr diff --git a/42sh/includes/builtin.h b/42sh/includes/builtin.h index e20e019b..5ce7da68 100644 --- a/42sh/includes/builtin.h +++ b/42sh/includes/builtin.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/14 22:59:57 by jhalford #+# #+# */ -/* Updated: 2017/03/25 02:18:19 by jhalford ### ########.fr */ +/* Updated: 2017/03/25 04:09:10 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,6 +49,11 @@ int builtin_math(const char *path, char *const av[], char *const envp[]); int builtin_func(const char *path, char *const av[], char *const envp[]); int bt_env_geti(char ***av, t_env_data *data); + +int get_cdpath(char *arg); +int process_dotdot(char *target); +int process_symlink(char *target); + int error_msg(char *msg); #endif diff --git a/42sh/libft/Makefile b/42sh/libft/Makefile index 8ab633b5..27ef1a47 100644 --- a/42sh/libft/Makefile +++ b/42sh/libft/Makefile @@ -192,6 +192,7 @@ str/ft_strstr.c\ str/ft_strsub.c\ str/ft_strtok.c\ str/ft_strtrim.c\ +sys/create_directory.c\ sys/dup2_close.c\ sys/fd_replace.c\ sys/ft_getenv.c\ diff --git a/42sh/libft/includes/sys.h b/42sh/libft/includes/sys.h index c7a046cb..229af35c 100644 --- a/42sh/libft/includes/sys.h +++ b/42sh/libft/includes/sys.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/14 17:24:23 by jhalford #+# #+# */ -/* Updated: 2017/03/25 01:42:01 by jhalford ### ########.fr */ +/* Updated: 2017/03/25 04:07:20 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,6 +35,7 @@ char *ft_getenv(char **env, char *key); int open_access(char *file, t_flag a_flag, t_flag o_flag, t_flag o_perm); int is_directory(const char *path); +char *create_direcotry(const char *path, const char *old_pathnames); int dup2_close(int fd1, int fd2); int fd_replace(int fd1, int fd2); diff --git a/42sh/libft/src/sys/create_directory.c b/42sh/libft/src/sys/create_directory.c new file mode 100644 index 00000000..10b4bdbe --- /dev/null +++ b/42sh/libft/src/sys/create_directory.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* create_directory.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/25 03:18:18 by ariard #+# #+# */ +/* Updated: 2017/03/25 04:13:15 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *create_directory(const char *path, const char *old_pathnames) +{ + char *new_pathnames; + char *newdir; + char *temp; + char *semi; + + new_pathnames = ft_strdup(old_pathnames); + temp = new_pathnames; + while (new_pathnames) + { + if ((semi = ft_strchr(new_pathnames, ':'))) + *semi = 0; + if (!is_directory(newdir = ft_str3join(new_pathnames, "/", path))) + ft_strdel(&newdir); + else + break; + new_pathnames += ft_strlen(new_pathnames) + 1; + } + ft_strdel(&temp); + return (newdir); +} diff --git a/42sh/log b/42sh/log deleted file mode 100644 index 2c0fdf70..00000000 --- a/42sh/log +++ /dev/null @@ -1,304 +0,0 @@ -Norme: ./src/builtin/bt_read_get.c -Norme: ./src/builtin/builtin_echo.c -Norme: ./src/builtin/bt_read_term.c -Norme: ./src/builtin/builtin_exit.c -Error (line 31): spaces at the end of line -Norme: ./src/builtin/builtin_func.c -Norme: ./src/builtin/builtin_cd.c -Error (line 74): comment not well formatted -Error (line 74): bad indentation -Error (line 74): comment not well placed -Norme: ./src/builtin/builtin_export.c -Error (line 60): line has 88 characters -Norme: ./src/builtin/builtin_hash.c -Norme: ./src/builtin/builtin_history.c -Norme: ./src/builtin/builtin_env.c -Error (line 51): line has 82 characters -Error (line 57): function builtin_env has 29 lines -Norme: ./src/builtin/builtin_unset.c -Norme: ./src/builtin/builtin_math.c -Norme: ./src/builtin/error_msg.c -Norme: ./src/builtin/builtin_unsetenv.c -Norme: ./src/builtin/is_builtin.c -Norme: ./src/builtin/builtin_setenv.c -Norme: ./src/completion/c_find_abspath.c -Norme: ./src/completion/c_find_binary.c -Norme: ./src/completion/c_arrow.c -Norme: ./src/builtin/builtin_read.c -Norme: ./src/completion/c_clear.c -Norme: ./src/completion/c_find_env.c -Norme: ./src/completion/c_match.c -Norme: ./src/completion/c_match_glob.c -Norme: ./src/completion/c_init.c -Norme: ./src/completion/c_match_update.c -Norme: ./src/completion/c_find_files.c -Norme: ./src/completion/c_misc.c -Norme: ./src/completion/c_output.c -Norme: ./src/completion/c_parser.c -Norme: ./src/completion/c_sizing.c -Norme: ./src/completion/c_printer.c -Norme: ./src/exec/ast_free.c -Norme: ./src/completion/c_terminal.c -Norme: ./src/completion/completion.c -Norme: ./src/exec/bad_fd.c -Norme: ./src/exec/exec_and_if.c -Norme: ./src/exec/exec_bang.c -Norme: ./src/exec/exec_ampersand.c -Norme: ./src/exec/exec_elif.c -Norme: ./src/exec/exec_case_branch.c -Norme: ./src/exec/exec_else.c -Norme: ./src/exec/exec_or_if.c -Norme: ./src/exec/exec_pipe.c -Norme: ./src/completion/c_pathsolver.c -Norme: ./src/exec/exec_semi.c -Norme: ./src/exec/exec_leaf.c -Norme: ./src/exec/exec_func.c -Norme: ./src/exec/exec_reset.c -Error (line 25): missing void in function exec_pushfds -Error (line 37): missing void in function exec_popfds -Norme: ./src/exec/fd_is_valid.c -Norme: ./src/exec/exec_var.c -Norme: ./src/exec/is_function.c -Norme: ./src/exec/ft_exec.c -Norme: ./src/exec/ft_findexec.c -Norme: ./src/exec/mark_process_status.c -Norme: ./src/exec/pfree_cond.c -Norme: ./src/exec/pfree_cmd.c -Norme: ./src/exec/pfree_list.c -Norme: ./src/exec/pfree_func.c -Norme: ./src/exec/pfree_subshell.c -Norme: ./src/exec/node_copy.c -Norme: ./src/exec/plaunch_brace.c -Norme: ./src/exec/plaunch_empty.c -Norme: ./src/exec/plaunch_builtin.c -Norme: ./src/exec/plaunch_case.c -Norme: ./src/exec/plaunch_function.c -Norme: ./src/exec/plaunch_if.c -Norme: ./src/exec/plaunch_for.c -Norme: ./src/exec/plaunch_subshell.c -Norme: ./src/exec/plaunch_until.c -Norme: ./src/exec/plaunch_while.c -Norme: ./src/exec/plaunch_file.c -Norme: ./src/exec/process_setgroup.c -Norme: ./src/exec/process_setsig.c -Norme: ./src/exec/pset_brace.c -Norme: ./src/exec/process_launch.c -Norme: ./src/exec/process_redirect.c -Norme: ./src/exec/pset_case.c -Norme: ./src/exec/pset_for.c -Norme: ./src/exec/pset_if.c -Norme: ./src/exec/pset_subshell.c -Norme: ./src/exec/pset_until.c -Norme: ./src/exec/pset_while.c -Norme: ./src/exec/pset_cmd.c -Norme: ./src/exec/redir_copy.c -Norme: ./src/exec/redir_free.c -Norme: ./src/exec/redirect_dgreat.c -Norme: ./src/exec/redirect_dless.c -Norme: ./src/exec/process_set.c -Norme: ./src/exec/redirect_great.c -Error (line 25, col 7): Spacing after call to exit -Norme: ./src/exec/redirect_less.c -Norme: ./src/exec/redirect_greatand.c -Norme: ./src/exec/redirect_lessand.c -Norme: ./src/exec/set_exitstatus.c -Norme: ./src/exec/token_to_argv.c -Norme: ./src/glob/esc_print.c -Norme: ./src/glob/command_getoutput.c -Norme: ./src/glob/dir_glob.c -Norme: ./src/glob/expand_esc.c -Norme: ./src/glob/expand_home.c -Norme: ./src/glob/expand_var.c -Norme: ./src/glob/expand_brace.c -Norme: ./src/glob/ft_strsplit_esc.c -Norme: ./src/glob/gen_tab_esc.c -Norme: ./src/glob/ft_strsplit_spe.c -Norme: ./src/glob/is_char_esc.c -Norme: ./src/glob/lib_perso/ft_ld_back.c -Norme: ./src/glob/lib_perso/ft_ld_clear.c -Norme: ./src/glob/lib_perso/ft_ld_copy.c -Norme: ./src/glob/lib_perso/ft_ld_front.c -Norme: ./src/glob/lib_perso/ft_ld_del.c -Norme: ./src/glob/lib_perso/ft_ld_new.c -Norme: ./src/glob/lib_perso/ft_ld_order.c -Norme: ./src/glob/lib_perso/ft_ld_pushback.c -Norme: ./src/glob/lib_perso/ft_ld_reverse.c -Norme: ./src/glob/lib_perso/ft_ld_pushfront.c -Norme: ./src/glob/lib_perso/ft_ld_size.c -Norme: ./src/glob/glob.c -Norme: ./src/glob/lib_perso/ft_ld_swap.c -Norme: ./src/glob/lib_perso/ft_memrealloc.c -Norme: ./src/glob/lib_perso/ft_ld_to_tab.c -Norme: ./src/glob/lib_perso/ft_strjoinf.c -Norme: ./src/glob/lib_perso/ft_strsubf.c -Norme: ./src/glob/lib_perso/ft_tablen.c -Norme: ./src/glob/lib_perso/ft_tabdel.c -Norme: ./src/glob/tab_esc_copy.c -Norme: ./src/glob/word_is_assignment.c -Norme: ./src/hash_table/ft_add_hash.c -Norme: ./src/hash_table/hash.c -Norme: ./src/hash_table/hash_free.c -Norme: ./src/hash_table/hash_str.c -Norme: ./src/hash_table/is_hash.c -Norme: ./src/glob/expand_bquote.c -Norme: ./src/history/add_str_in_history.c -Norme: ./src/history/history.c -Norme: ./src/history/history_parsing_toolz_2.c -Norme: ./src/history/history_parsing_toolz.c -Norme: ./src/history/list_toolz.c -Norme: ./src/job_control/builtin_bg.c -Norme: ./src/history/history_parsing.c -Norme: ./src/glob/match_pattern.c -Norme: ./src/job_control/builtin_fg.c -Norme: ./src/job_control/do_job_notification.c -Norme: ./src/history/surch_in_history.c -Norme: ./src/job_control/has_running_job.c -Norme: ./src/job_control/has_stopped_job.c -Norme: ./src/job_control/job_cmp_id.c -Norme: ./src/job_control/job_format.c -Norme: ./src/job_control/job_format_head.c -Norme: ./src/job_control/job_free.c -Norme: ./src/job_control/job_addprocess.c -Norme: ./src/job_control/job_getprocess.c -Norme: ./src/job_control/job_hup_all.c -Norme: ./src/job_control/job_is_completed.c -Norme: ./src/job_control/builtin_jobs.c -Norme: ./src/job_control/job_is_stopped.c -Norme: ./src/job_control/job_notify_change.c -Norme: ./src/job_control/job_getrank.c -Norme: ./src/job_control/job_run.c -Norme: ./src/job_control/job_notify_new.c -Norme: ./src/job_control/job_update_id.c -Norme: ./src/job_control/job_remove.c -Norme: ./src/job_control/job_update_status.c -Norme: ./src/job_control/mark_job_as_running.c -Norme: ./src/job_control/pprint_brace.c -Norme: ./src/job_control/pprint_case.c -Norme: ./src/job_control/pprint_cmd.c -Norme: ./src/job_control/pprint_for.c -Norme: ./src/job_control/pprint_function.c -Norme: ./src/job_control/pprint_if.c -Norme: ./src/job_control/pprint_subshell.c -Norme: ./src/job_control/job_wait.c -Norme: ./src/job_control/pprint_while.c -Norme: ./src/job_control/process_cmp_pid.c -Norme: ./src/job_control/pprint_until.c -Norme: ./src/job_control/process_free.c -Norme: ./src/job_control/put_job_in_background.c -Norme: ./src/job_control/sigchld_handler.c -Norme: ./src/job_control/sigint_handler.c -Norme: ./src/job_control/sigtstp_handler.c -Norme: ./src/job_control/sigttin_handler.c -Norme: ./src/job_control/sigttou_handler.c -Norme: ./src/lexer/get_lexer_stack.c -Norme: ./src/job_control/put_job_in_foreground.c -Error (line 27): bad indentation -Error (line 27): C++ comment -Norme: ./src/lexer/get_lexer_stack2.c -Norme: ./src/lexer/do_lexer_routine.c -Norme: ./src/lexer/get_state_global.c -Norme: ./src/lexer/get_state_redir.c -Norme: ./src/lexer/insert_newline.c -Norme: ./src/lexer/keep_last_type.c -Norme: ./src/lexer/isrw_delim.c -Norme: ./src/lexer/lexer_backslash.c -Norme: ./src/lexer/get_reserved_words.c -Norme: ./src/lexer/lexer_curly_braces.c -Norme: ./src/job_control/process_format.c -Norme: ./src/lexer/lexer_default.c -Norme: ./src/lexer/lexer_bquote.c -Norme: ./src/lexer/lexer_destroy.c -Norme: ./src/lexer/lexer_delim.c -Norme: ./src/lexer/lexer_end.c -Norme: ./src/lexer/lexer_heredoc.c -Norme: ./src/lexer/lexer_dquote.c -Norme: ./src/lexer/lexer_great.c -Norme: ./src/lexer/lexer_init.c -Norme: ./src/lexer/lexer_less.c -Norme: ./src/lexer/lexer_newline.c -Norme: ./src/lexer/lexer_lex.c -Norme: ./src/lexer/lexer_quote.c -Norme: ./src/lexer/lexer_paren.c -Norme: ./src/lexer/lexer_number.c -Norme: ./src/lexer/lexer_sep.c -Norme: ./src/lexer/token_cmp_type.c -Norme: ./src/lexer/token_free.c -Norme: ./src/lexer/token_init.c -Norme: ./src/lexer/lexer_word.c -Norme: ./src/lexer/token_print.c -Norme: ./src/line_editing/copy_cut_paste/underline_down.c -Norme: ./src/lexer/token_append.c -Norme: ./src/line_editing/control_features.c -Norme: ./src/line_editing/copy_cut_paste/underline_end.c -Norme: ./src/line_editing/copy_cut_paste/underline_function.c -Norme: ./src/line_editing/copy_cut_paste/underline_home.c -Norme: ./src/line_editing/copy_cut_paste/underline_left.c -Norme: ./src/line_editing/copy_cut_paste/underline_reset.c -Norme: ./src/line_editing/copy_cut_paste/underline_up.c -Norme: ./src/line_editing/copy_cut_paste/underline_right.c -Norme: ./src/line_editing/copy_cut_paste/copy_cut_paste.c -Norme: ./src/line_editing/init_line/init_history.c -Norme: ./src/line_editing/init_line/init_line.c -Norme: ./src/line_editing/init_line/init_termcaps.c -Norme: ./src/line_editing/lib_line_editing/ft_nb_line.c -Norme: ./src/line_editing/ft_prompt.c -Norme: ./src/line_editing/get_key.c -Norme: ./src/line_editing/lib_line_editing/toolz.c -Norme: ./src/line_editing/lib_line_editing/tool_line.c -Norme: ./src/line_editing/lib_line_editing/tool_line_2.c -Norme: ./src/line_editing/lib_line_editing/toolz_parseur.c -Norme: ./src/line_editing/lib_line_editing/toolz_termcaps.c -Norme: ./src/line_editing/lib_line_editing/toolz2.c -Norme: ./src/line_editing/move_term/home_end.c -Norme: ./src/line_editing/move_term/move_left_and_right.c -Norme: ./src/line_editing/print_del_completion/completion.c -Norme: ./src/line_editing/move_term/move_up_and_down.c -Norme: ./src/line_editing/readline.c -Norme: ./src/line_editing/resize.c -Norme: ./src/main/data_exit.c -Norme: ./src/line_editing/print_del_completion/queue.c -Norme: ./src/main/data_singleton.c -Norme: ./src/line_editing/move_term/move_to_word.c -Norme: ./src/line_editing/print_del_completion/print_and_del.c -Norme: ./src/main/data_init.c -Norme: ./src/main/ft_putast.c -Error (line 15): function ft_putast has 83 lines -Error (line 15): declarations must be followed by one empty line in ft_putast -Error (line 19): Empty line -Error (line 52, col 21): missing space around == -Norme: ./src/main/shell_reset.c -Norme: ./src/main/main.c -Norme: ./src/main/shell_init.c -Norme: ./src/parser/add_bang.c -Norme: ./src/parser/add_case.c -Norme: ./src/parser/add_condition.c -Norme: ./src/parser/add_func.c -Norme: ./src/parser/add_cmd.c -Norme: ./src/parser/add_number.c -Norme: ./src/parser/add_sep.c -Norme: ./src/parser/add_loop.c -Norme: ./src/parser/add_subshell.c -Norme: ./src/parser/do_parser_routine.c -Norme: ./src/parser/error_syntax.c -Norme: ./src/parser/add_redir.c -Norme: ./src/parser/build_tree.c -Norme: ./src/parser/ft_parse.c -Norme: ./src/parser/parser_destroy.c -Norme: ./src/parser/parser_init.c -Norme: ./src/parser/heredoc_parser.c -Norme: ./src/parser/pop_stack.c -Norme: ./src/parser/push_stack.c -Norme: ./src/parser/produce_sym.c -Norme: ./src/parser/redir_init.c -Norme: ./src/parser/stack_init.c -Norme: ./src/parser/sym_free.c -Norme: ./src/parser/tree_func_free.c -Norme: ./src/parser/tree_wrapper.c -Norme: ./src/parser/read_stack.c -Error (line 15): function read_state has 203 lines -Norme: ./src/parser/aggregate_sym.c -Error (line 401): C++ comment -Error (line 402): C++ comment -Error (line 403): C++ comment -Norme: ./src/parser/eval_sym.c -Error (line 1300): C++ comment diff --git a/42sh/src/builtin/bt_cd_getpath.c b/42sh/src/builtin/bt_cd_getpath.c new file mode 100644 index 00000000..addbbb06 --- /dev/null +++ b/42sh/src/builtin/bt_cd_getpath.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* bt_cd_getpath.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/25 03:52:52 by ariard #+# #+# */ +/* Updated: 2017/03/25 04:05:06 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int get_cdpath(char *arg) +{ + char *cdpath; + char *target; + + if (!(cdpath = ft_getenv(data_singleton()->env, "CDPATH"))) + { + if (!is_directory(target = ft_str3join(".", "/", arg))) + ft_strdel(&target); + } + else + target = create_directory(arg, cdpath); + return (target); +} diff --git a/42sh/src/builtin/bt_cd_process_dotdot.c b/42sh/src/builtin/bt_cd_process_dotdot.c new file mode 100644 index 00000000..e4043b79 --- /dev/null +++ b/42sh/src/builtin/bt_cd_process_dotdot.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* bt_cd_process_dotdot.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/25 03:54:22 by ariard #+# #+# */ +/* Updated: 2017/03/25 04:01:03 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int process_dotdot(char *target) +{ + return (0); +} diff --git a/42sh/src/builtin/bt_cd_process_symlink.c b/42sh/src/builtin/bt_cd_process_symlink.c new file mode 100644 index 00000000..e69de29b diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index 58c7c548..b88fcf1d 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:57:53 by jhalford #+# #+# */ -/* Updated: 2017/03/25 01:20:39 by wescande ### ########.fr */ +/* Updated: 2017/03/25 04:09:23 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,6 @@ static char *bt_cd_target(char *arg) DG("doing -"); if (!(target = ft_getenv(data_singleton()->env, "OLDPWD"))) SH_ERR(CDERR_2, "OLDPWD"); - DG("found OLDPWD %s", target); } else target = arg; diff --git a/42sh/src/builtin/builtin_new_cd.c b/42sh/src/builtin/builtin_new_cd.c new file mode 100644 index 00000000..3a0fef44 --- /dev/null +++ b/42sh/src/builtin/builtin_new_cd.c @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtin_new_cd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ariard +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/03/25 02:00:40 by ariard #+# #+# */ +/* Updated: 2017/03/25 04:05:49 by ariard ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +#define CD_OPT_L (1 << 0) +#define CD_OPT_P (1 << 1) +#define HAS_CDOPT_P(x) (x & CD_OPT_P) +#define HAS_CDOPT_L(x) (x & CD_OPT_L) +#define CDERR_0 "cd: too many arguments" +#define CDERR_1 "cd %s not set" + +static t_cliopts g_cdopts[] = +{ + {'P', NULL, CD_OPT_P, CD_OPT_L, NULL, 0}, + {'L', NULL, CD_OPT_L, CD_OPT_P, NULL, 0}, + {0, NULL, 0, 0, NULL, 0}, +}; + +static char *cd_operand_exist(char *arg) +{ + char *target; + + if (!arg) + { + if (!(target = ft_getenv(data_singleton()->env, "HOME"))) + SH_ERR(CDERR_1, "HOME"); + } + else + target = arg; + return (target); +} + +static char *cd_operand_begin(char *arg) +{ + char *target; + + if (arg && arg[0]) + { + if (arg[0] = '/') + target = arg; + else if (arg[0] = '.') + target = ft_str3join(ft_getenv(&data_singleton()->env, + "PWD"), "/", arg); + else if (ft_strcmp(arg, "-") == 0) + { + if (!(target = ft_getenv(data_singleton()->env, "OLDPWD"))) + SH_ERR(CDERR_2, "OLDPWD"); + } + else + target = get_cdpath(arg); + } + return (target); +} + +void setwd(char *var) +{ + char *cwd; + + cwd = getcwd(NULL, 0); + builtin_setenv(NULL, (char*[]){"cd", var, cwd, NULL}, NULL); + free(cwd); +} + +int builtin_cd(const char *path, char *const av[], + char *const av[], char *const envp[]) +{ + char *target; + t_data_template data; + + (void)envp; + (void)path; + data.flag = CD_OPT_L; + if (cliopts_get((char **av, g_cdopts, &data)) + return (1); + if (data.av_data[0] && data.av_data[1]) + return (SH_ERR(CDERR_0) && SH_ERR(CD_USAGE)); + if (!(target = cd_operand_exist(*data.av_data))) + return (1); + setwd("OLDPWD"); + if (!target) + target = cd_operand_begin(*data.av_data); + if (HAS_CDOPT_P(data.flag)) + process_symlink(target); + else + process_dotdot(target); + setwd("PWD"); + return (0); +} diff --git a/42sh/test.c b/42sh/test.c deleted file mode 100644 index 4a4f1bfd..00000000 --- a/42sh/test.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "stdio.h" - -int main(void) -{ - printf("hello"); - return (0); -}