From 10a5a81fd27fa089dacb8318b9759ba72aef4c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A8Roman?= <¨roman.mikhaylenko14@hotmail.com¨> Date: Tue, 3 Sep 2024 15:16:16 +0100 Subject: [PATCH 1/3] merge: merge_dev into main --- minishell | Bin 0 -> 109536 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 minishell diff --git a/minishell b/minishell new file mode 100755 index 0000000000000000000000000000000000000000..b2627880ad42a3a7e50d2748b6d983e0aa2c6d00 GIT binary patch literal 109536 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 Date: Tue, 3 Sep 2024 15:16:26 +0100 Subject: [PATCH 2/3] merge: merge_dev into main --- minishell | Bin 109536 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 minishell diff --git a/minishell b/minishell deleted file mode 100755 index b2627880ad42a3a7e50d2748b6d983e0aa2c6d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109536 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 Date: Fri, 6 Sep 2024 13:48:25 +0100 Subject: [PATCH 3/3] Merge dev (#28) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add: get local_vars using $ * add: heredoc now returns expanded env_arvs and loc_args * fix: norminette for heredoc env_var functionality * fix: working on interpreting $a$b together * fix: done echo a$a$b * fix: norminette after a$a$b fix * refactoring * new: errors * add: exit_status * fix:compilation issues * fix: builtin_exit * fix * fix:exit * add: norm, fix: issues --------- Co-authored-by: ¨Roman <¨roman.mikhaylenko14@hotmail.com¨> Co-authored-by: Dmitry Demirkylych Co-authored-by: Dmitry Demirkylych --- Makefile | 17 +++- inc/env.h | 6 +- inc/execute.h | 8 +- inc/exit_status.h | 41 +++++++++ inc/tokens.h | 9 +- src/builtins/cd.c | 18 ++-- src/builtins/echo.c | 12 ++- src/builtins/env.c | 12 ++- src/builtins/exit.c | 44 ++++++++-- src/builtins/export.c | 58 ++++++++----- src/builtins/pwd.c | 11 +-- src/builtins/unset.c | 21 ++--- src/env/env.c | 4 +- src/env/utils.c | 19 +---- src/execute/execute.c | 13 ++- src/execute/utils_0.c | 15 +--- src/exit_status/exit_status.c | 71 ++++++++++++++++ src/exit_status/exit_status_utils.c | 47 +++++++++++ src/main.c | 1 + src/parser/parser_helper_helpers.c | 27 ++---- src/parser/parser_joint_vars.c | 73 ++++++++++++++++ src/redirection/redirect_heredoc.c | 50 +++++++++-- src/shell_variables/shell_variables.c | 94 +++++++++++++-------- src/shell_variables/shell_variables_utils.c | 23 +++-- src/utils/initialise.c | 6 +- 25 files changed, 514 insertions(+), 186 deletions(-) create mode 100644 inc/exit_status.h create mode 100644 src/exit_status/exit_status.c create mode 100644 src/exit_status/exit_status_utils.c create mode 100644 src/parser/parser_joint_vars.c diff --git a/Makefile b/Makefile index 96fd8281..5e6a481b 100644 --- a/Makefile +++ b/Makefile @@ -6,14 +6,14 @@ # By: dmdemirk + +/* exit status */ +void exit_status_handler(t_ms_data *data, int status_code, char *err_arg); +void set_exit_status(int *exit_status, int status_code); + +/* exit_status_utils */ +int ft_perror(char *str); +int ft_isnumber(char *str); + +#endif diff --git a/inc/tokens.h b/inc/tokens.h index c0489ac5..2427e05f 100644 --- a/inc/tokens.h +++ b/inc/tokens.h @@ -6,7 +6,7 @@ /* By: rmikhayl +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/05/31 20:53:51 by rmikhayl #+# #+# */ -/* Updated: 2024/06/26 14:39:34 by dmdemirk ### ########.fr */ +/* Updated: 2024/09/06 12:29:14 by dmdemirk ### ########.fr */ /* */ /* ************************************************************************** */ @@ -88,7 +88,7 @@ void loop_cleanup(char *line, t_token *tokens, \ void free_ms_data(t_ms_data *data); char *check_heredoc(char *line); char *heredoc(char *eof); -void init_ms_data(t_ms_data *data,char **argv, char **envp); +void init_ms_data(t_ms_data *data, char **argv, char **envp); void initialise(int argc, char **argv); void execute_command(char **parsed_text, t_token **tokens); void print_maxishell(void); @@ -107,7 +107,7 @@ t_ast *new_ast_node(t_token_type type); t_ast *create_redir(t_token **tokens, t_token *tmp, t_ms_data *data); int arg_len(t_token *current); void set_command_args(t_ast *command_node, t_token **tokens, \ - int arg_count); + int arg_count); t_ast *manage_commands(t_token **tokens, t_ms_data *data); t_ast *create_redir_node(t_token *token); int is_redir_node(t_token *tokens); @@ -116,5 +116,8 @@ t_ast *manage_pipe(t_token **tokens, t_ms_data *data); char *trim_input(char *str); void print_ast_root(t_ast *root); void execute_tree(t_ast *node, t_ms_data *data); +char *expand_env_and_loc_var(char *arg, t_ms_data *data); +char *append_literal(char **start, char *processed_arg); +char *process_argument(char *arg, t_ms_data *data); #endif diff --git a/src/builtins/cd.c b/src/builtins/cd.c index 79a3d872..382e4a4b 100644 --- a/src/builtins/cd.c +++ b/src/builtins/cd.c @@ -6,7 +6,7 @@ /* By: dmdemirk args[1]; if (!target_dir) target_dir = home_dir; - if (chdir(target_dir) != 0) + if (chdir(target_dir) == -1) { - ft_putstr_fd("bash: cd: ", 2); - perror(target_dir); - return (1); + if (errno == EACCES) + exit_status_handler(data, PERMISSION_DENIED, \ + ft_strjoin("cd: ", target_dir)); + if (errno == ENOENT) + exit_status_handler(data, IS_DIRECTORY, \ + ft_strjoin("cd: ", target_dir)); + return (EXIT_FAILURE); } set_env(&data->envp, "OLDPWD", get_env(data->envp, "PWD")); if (getcwd(cwd, sizeof(cwd)) != NULL) set_env(&data->envp, "PWD", cwd); - return (0); + return (EXIT_SUCCESS); } diff --git a/src/builtins/echo.c b/src/builtins/echo.c index 36dacee0..eae4c965 100644 --- a/src/builtins/echo.c +++ b/src/builtins/echo.c @@ -12,6 +12,7 @@ #include "libft.h" #include "shell.h" +#include "exit_status.h" /* Functionality: @@ -23,8 +24,6 @@ int builtin_echo(t_ms_data *data) int newline; int i; - if (data->std_out == -1) - data->std_out = 1; newline = 1; if (data->args[1] && (ft_strcmp(data->args[1], "-n") == 0)) { @@ -34,12 +33,11 @@ int builtin_echo(t_ms_data *data) i = 0; while (data->args[++i]) { - write(1, data->args[i], ft_strlen(data->args[i])); + ft_putstr_fd(data->args[i], STDOUT_FILENO); if (data->args[i + 1]) - write(data->std_out, " ", 1); + ft_putstr_fd(" ", STDOUT_FILENO); } if (newline) - write(data->std_out, "\n", 1); - data->std_out = -1; - return (0); + write(STDOUT_FILENO, "\n", 1); + return (EXIT_SUCCESS); } diff --git a/src/builtins/env.c b/src/builtins/env.c index 157574ff..7812a352 100644 --- a/src/builtins/env.c +++ b/src/builtins/env.c @@ -15,6 +15,7 @@ #include "libft.h" #include #include +#include "exit_status.h" void print_env_stack(t_env *envp); int builtin_env(t_ms_data *data); @@ -36,5 +37,14 @@ int builtin_env(t_ms_data *data) ft_printf("\nbuiltin_env\n"); if (ft_strcmp(data->args[0], "env") == 0 && data->args[1] == NULL) print_env_stack(data->envp); - return (0); + else + { + ft_putstr_fd("env: '", STDERR_FILENO); + ft_putstr_fd(data->args[1], STDERR_FILENO); + ft_putstr_fd("': No such file or directory\n", STDERR_FILENO); + set_exit_status(&data->exit_status, IS_DIRECTORY); + set_shell_var(&data->shell_variables, "?", ft_itoa(data->exit_status)); + return (IS_DIRECTORY); + } + return (EXIT_SUCCESS); } diff --git a/src/builtins/exit.c b/src/builtins/exit.c index 68e07cae..6b9e7a2c 100644 --- a/src/builtins/exit.c +++ b/src/builtins/exit.c @@ -6,7 +6,7 @@ /* By: dmdemirk #include #include "env.h" +#include "exit_status.h" /* Functionality: @@ -23,11 +24,44 @@ - Exit with the exit status */ +void handle_numeric_error(t_ms_data *data, const char *arg) +{ + exit_status_handler(data, NUMERIC_REQUIRED, ft_strjoin("exit: ", arg)); + exit(NUMERIC_REQUIRED); +} + +void handle_too_many_args_error(t_ms_data *data) +{ + exit_status_handler(data, TOO_MANY_ARGS, "exit"); + exit(TOO_MANY_ARGS); +} + +void handle_exit(t_ms_data *data, int status) +{ + ft_putendl_fd("exit", STDOUT_FILENO); + data->exit_status = status; + set_shell_var(&data->shell_variables, "?", ft_itoa(data->exit_status)); + exit(status); +} + int builtin_exit(t_ms_data *data) { - const char *message; + int number; - message = "exit\n"; - write(STDOUT_FILENO, message, ft_strlen(message)); - exit(data->exit_status); + number = 0; + if (data->args[1]) + { + if (ft_isnumber(data->args[1]) == 0) + handle_numeric_error(data, data->args[1]); + else if (data->args[2]) + handle_too_many_args_error(data); + else + { + number = ft_atoi(data->args[1]); + handle_exit(data, number); + } + } + else + handle_exit(data, 0); + return (0); } diff --git a/src/builtins/export.c b/src/builtins/export.c index 692c876d..40b33b39 100644 --- a/src/builtins/export.c +++ b/src/builtins/export.c @@ -6,7 +6,7 @@ /* By: dmdemirk #include "shell.h" #include +#include "exit_status.h" /* Functionalities: @@ -22,37 +23,54 @@ - If arguments are passed, set the environment variables */ -int builtin_export(t_ms_data *data); -static void add_env(t_ms_data *data); +int builtin_export(t_ms_data *data); +static void print_env(t_env *env); +static void add_env(t_ms_data *data); int builtin_export(t_ms_data *data) +{ + if (data->args == NULL || data->args[1] == NULL) + { + print_env(data->envp); + return (EXIT_SUCCESS); + } + if (ft_strcmp(data->args[1], "-p") != 0 && data->args[1][0] == '-') + { + exit_status_handler(data, INVALID_OPTION, \ + ft_strjoin("export: ", data->args[1])); + ft_putendl_fd("export: usage: export [-p]" \ + "[name[=value] ...] or export -p", STDERR_FILENO); + return (INVALID_OPTION); + } + else if (ft_strcmp(data->args[1], "-p") == 0) + { + print_env(data->envp); + return (EXIT_SUCCESS); + } + add_env(data); + return (EXIT_SUCCESS); +} + +static void print_env(t_env *env) { t_env *curr_node; - if ((data->args[1] == NULL) \ - || ft_strncmp(data->args[1], "-p", 1) == 0) + curr_node = env; + while (curr_node) { - curr_node = data->envp; - while (curr_node) - { - if (!ft_strcmp(curr_node->value, "")) - printf("declare -x %s\n", curr_node->key); - else - printf("declare -x %s=\"%s\"\n", curr_node->key, curr_node->value); - curr_node = curr_node->next; - } + if (!ft_strcmp(curr_node->value, "")) + printf("declare -x %s\n", curr_node->key); + else + printf("declare -x %s=\"%s\"\n", curr_node->key, curr_node->value); + curr_node = curr_node->next; } - else - add_env(data); - return (0); } - static void add_env(t_ms_data *data) { int i; - char* key; - char* curr_arg; + char *key; + char *curr_arg; i = 0; key = NULL; diff --git a/src/builtins/pwd.c b/src/builtins/pwd.c index ce19efb0..9eb18beb 100644 --- a/src/builtins/pwd.c +++ b/src/builtins/pwd.c @@ -6,7 +6,7 @@ /* By: dmdemirk #include "libft.h" #include +#include "exit_status.h" /* Functionality: @@ -27,11 +28,5 @@ int builtin_pwd(t_ms_data *data) (void)data; if (getcwd(cwd, sizeof(cwd)) != NULL) ft_putendl_fd(cwd, STDOUT_FILENO); - else - { - ft_putstr_fd("bash: cd: ", 2); - perror("cwd"); - return (1); - } - return (0); + return (EXIT_SUCCESS); } diff --git a/src/builtins/unset.c b/src/builtins/unset.c index 874ab2bf..f319f05f 100644 --- a/src/builtins/unset.c +++ b/src/builtins/unset.c @@ -6,7 +6,7 @@ /* By: dmdemirk +#include "exit_status.h" + +#include /* todo - set the exit status to 1 if the variable is not a valid identifier + set the exit status to ERROR if the variable is not a valid identifier Functionality: - Unset the environment variable -- Return 1 if the variable is not a valid identifier +- Return ERROR if the variable is not a valid identifier */ int builtin_unset(t_ms_data *data) { int i; - int exit_status; char *key; i = 0; - exit_status = 0; while (data->args[++i]) { - key = data->args[i]; + key = data->args[i]; if (unset_env(&data->envp, key) == -1) { - ft_putstr_fd("bash: unset: `", STDERR_FILENO); - ft_putstr_fd(key, STDERR_FILENO); - ft_putendl_fd("': not a valid identifier", STDERR_FILENO); - exit_status = 1; + return (EXIT_SUCCESS); } } - data->exit_status = exit_status; - return (exit_status); + return (EXIT_SUCCESS); } diff --git a/src/env/env.c b/src/env/env.c index 815142e2..cf2bf419 100644 --- a/src/env/env.c +++ b/src/env/env.c @@ -6,7 +6,7 @@ /* By: dmdemirk next; } return (-1); -} \ No newline at end of file +} diff --git a/src/env/utils.c b/src/env/utils.c index 36638100..8f0406bc 100644 --- a/src/env/utils.c +++ b/src/env/utils.c @@ -6,7 +6,7 @@ /* By: dmdemirk next; i++; } -} \ No newline at end of file +} diff --git a/src/execute/execute.c b/src/execute/execute.c index a2f22af6..65b947cf 100644 --- a/src/execute/execute.c +++ b/src/execute/execute.c @@ -19,6 +19,7 @@ #include "tokens.h" #include "pipe.h" #include "redirection.h" +#include "exit_status.h" int execute_ast(t_ast *node, t_ms_data *data); static int execute(t_ms_data *data); @@ -37,11 +38,9 @@ static int new_process(t_ms_data *data); int execute_ast(t_ast *node, t_ms_data *data) { if (!node) - return (1); + return (EXIT_FAILURE); if (node->type == PIPE) return (builtin_pipe(node, data)); - // else if (node->type == ENV_VAR) - // return (handle_shell_variable(node, data)); else if (node->type == REDIR_IN) return (redirect_in(node, data)); else if (node->type == REDIR_OUT) @@ -55,7 +54,7 @@ int execute_ast(t_ast *node, t_ms_data *data) data->args = node->args; return (execute(data)); } - return (0); + return (EXIT_SUCCESS); } /** @@ -101,8 +100,8 @@ static int execute(t_ms_data *data) - - @param data minishell data structure - @return int return status: - - - 0: success - - - 1: error + - - 0: SUCCESS + - - 1: ERROR */ static int new_process(t_ms_data *data) @@ -129,5 +128,5 @@ static int new_process(t_ms_data *data) } close_fds(data->std_in, data->std_out); waitpid(pid, &data->exit_status, 0); - return (0); + return (EXIT_SUCCESS); } diff --git a/src/execute/utils_0.c b/src/execute/utils_0.c index 40110bad..4402fa00 100644 --- a/src/execute/utils_0.c +++ b/src/execute/utils_0.c @@ -13,6 +13,7 @@ #include "libft.h" #include #include "shell.h" +#include "execute.h" void ft_free_2d_arr(char **arr); int ft_perror(char *str); @@ -35,20 +36,6 @@ void ft_free_2d_arr(char **arr) free(arr); } -/** -- @brief return error message and exit -- -- @param str paste the error message -- @return int return status: -- - 1: EXIT_FAILURE - */ - -int ft_perror(char *str) -{ - perror (str); - exit(EXIT_FAILURE); -} - /** - @brief close two file descriptors - diff --git a/src/exit_status/exit_status.c b/src/exit_status/exit_status.c new file mode 100644 index 00000000..ef1ffb19 --- /dev/null +++ b/src/exit_status/exit_status.c @@ -0,0 +1,71 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* exit_status.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dmdemirk +#include "shell.h" + +#include + +void exit_status_handler(t_ms_data *data, int status_code, char *err_arg); +void ft_puterror(char *err_arg, char *error_message); +void set_exit_status(int *exit_status, int status_code); + +void exit_status_handler(t_ms_data *data, int status_code, char *err_arg) +{ + char *error_message; + + error_message = NULL; + if (status_code == IS_DIRECTORY) + error_message = "No such file or directory"; + else if (status_code == NUMERIC_REQUIRED) + error_message = "numeric argument required"; + else if (status_code == TOO_MANY_ARGS) + error_message = "too many arguments"; + else if (status_code == UNKNOWN_COMMAND) + error_message = "command not found"; + else if (status_code == INVALID_ARGUMENT) + error_message = "invalid argument"; + else if (status_code == PERMISSION_DENIED) + error_message = "permission denied"; + else if (status_code == NOT_VALID_IDENTIFIER) + error_message = "unset: not a valid identifier"; + else if (status_code == INVALID_OPTION) + error_message = "invalid option"; + else + error_message = "error"; + ft_puterror(err_arg, error_message); + set_exit_status(&data->exit_status, status_code); + set_shell_var(&data->shell_variables, "?", ft_itoa(data->exit_status)); +} + +void ft_puterror(char *err_arg, char *error_message) +{ + if (err_arg) + { + ft_putstr_fd("bash: ", STDERR_FILENO); + ft_putstr_fd(err_arg, STDERR_FILENO); + ft_putstr_fd(": ", STDERR_FILENO); + ft_putendl_fd(error_message, STDERR_FILENO); + } + else + { + ft_putstr_fd("bash: ", STDERR_FILENO); + ft_putendl_fd(error_message, STDERR_FILENO); + } +} + +void set_exit_status(int *exit_status, int status_code) +{ + *exit_status = status_code; +} diff --git a/src/exit_status/exit_status_utils.c b/src/exit_status/exit_status_utils.c new file mode 100644 index 00000000..3a8f5246 --- /dev/null +++ b/src/exit_status/exit_status_utils.c @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* exit_status_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dmdemirk +#include +#include "libft.h" + +int ft_perror(char *str); +int ft_isnumber(char *str); + +/** + - @brief return error message and exit + - + - @param str paste the error message + - @return int return status: + - - 1: ERROR + */ + +int ft_perror(char *str) +{ + perror (str); + exit(EXIT_FAILURE); +} + +int ft_isnumber(char *str) +{ + int i; + + i = 0; + while (str[i]) + { + if (!ft_isdigit(str[i])) + return (0); + i++; + } + return (1); +} diff --git a/src/main.c b/src/main.c index e36f4a30..f91ffcae 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,7 @@ void process_ast_and_io(t_ms_data *data, t_loop_data *loop_data) print_ast_root(loop_data->tree); status = execute_ast(loop_data->tree, data); + shell_variable_update(data, status); if (status_handler(status, loop_data)) { handle_io_fd(data); diff --git a/src/parser/parser_helper_helpers.c b/src/parser/parser_helper_helpers.c index 2b498186..e9ae7d9c 100644 --- a/src/parser/parser_helper_helpers.c +++ b/src/parser/parser_helper_helpers.c @@ -36,7 +36,7 @@ void final_quote_removal(int arg_count, t_ast *command_node) } } -char *expand_env_var(char *arg, t_ms_data *data) +char *expand_env_and_loc_var(char *arg, t_ms_data *data) { char *env_value; @@ -47,10 +47,12 @@ char *expand_env_var(char *arg, t_ms_data *data) if (arg[ft_strlen(arg) - 1] == '"') arg[ft_strlen(arg) - 1] = '\0'; env_value = get_env(data->envp, arg + 1); + if (!env_value) + env_value = get_env(data->shell_variables, arg + 1); if (env_value) return (ft_strdup(env_value)); } - return (ft_strdup(arg)); + return (ft_strdup("")); } void handle_local_vars(t_ms_data *data, char *arg) @@ -75,30 +77,17 @@ void handle_local_vars(t_ms_data *data, char *arg) } } -void post_process_command_args(t_ast *command_node, int arg_count, \ - t_ms_data *data) +void post_process_command_args(t_ast *command_node, int arg_count \ + , t_ms_data *data) { int i; - char *arg; char *processed_arg; i = 0; while (i < arg_count) { - arg = command_node->args[i]; - handle_local_vars(data, arg); - processed_arg = NULL; - if (arg[0] == '$' || (arg[0] == '"' && arg[1] == '$')) - { - if (arg[0] == '"') - processed_arg = expand_env_var(arg + 1, data); - else - processed_arg = expand_env_var(arg, data); - } - else if (arg[0] == '\'') - processed_arg = ft_strdup(arg); - else - processed_arg = ft_strdup(arg); + handle_local_vars(data, command_node->args[i]); + processed_arg = process_argument(command_node->args[i], data); free(command_node->args[i]); command_node->args[i] = processed_arg; i++; diff --git a/src/parser/parser_joint_vars.c b/src/parser/parser_joint_vars.c new file mode 100644 index 00000000..94bbd0b4 --- /dev/null +++ b/src/parser/parser_joint_vars.c @@ -0,0 +1,73 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_joint_vars.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rmikhayl +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/09/04 16:46:53 by rmikhayl #+# #+# */ +/* Updated: 2024/09/04 16:46:57 by rmikhayl ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +char *expand_variable(char **start, t_ms_data *data) +{ + char *var_name; + char *expanded_var; + char *var_start; + + var_start = *start; + (*start)++; + while (**start != '\0' && (ft_isalnum(**start) || **start == '_')) + (*start)++; + var_name = ft_substr(var_start, 0, *start - var_start); + expanded_var = expand_env_and_loc_var(var_name, data); + free(var_name); + return (expanded_var); +} + +char *append_literal(char **start, char *processed_arg) +{ + char *literal_part; + char *literal_start; + char *tmp; + + literal_start = *start; + while (**start != '\0' && **start != '$') + (*start)++; + literal_part = ft_substr(literal_start, 0, *start - literal_start); + tmp = ft_strjoin(processed_arg, literal_part); + free(literal_part); + free(processed_arg); + return (tmp); +} + +char *process_argument(char *arg, t_ms_data *data) +{ + char *start; + char *processed_arg; + char *tmp; + char *expanded_var; + + processed_arg = ft_strdup(""); + start = arg; + while (*start != '\0') + { + if (*start == '$') + { + expanded_var = expand_variable(&start, data); + if (expanded_var != NULL) + { + tmp = ft_strjoin(processed_arg, expanded_var); + free(processed_arg); + processed_arg = tmp; + free(expanded_var); + } + } + else + processed_arg = append_literal(&start, processed_arg); + } + return (processed_arg); +} diff --git a/src/redirection/redirect_heredoc.c b/src/redirection/redirect_heredoc.c index eef88c40..1edd6c5c 100644 --- a/src/redirection/redirect_heredoc.c +++ b/src/redirection/redirect_heredoc.c @@ -31,14 +31,48 @@ static void execute_child(t_ast *node, t_ms_data *data, int *file_fd); - 1: error */ -int is_in_quotes(char *arg) +static char *assemble_result(char **tokens, size_t result_len) { - if (arg[0] == '\"' && arg[ft_strlen(arg) - 1] == '\"' ) + char *result; + int i; + + result = malloc(result_len + 1); + if (!result) + return (NULL); + *result = '\0'; + i = 0; + while (tokens[i]) { - printf("quoted eof\n"); - return (1); + ft_strcat(result, tokens[i]); + if (tokens[i + 1]) + ft_strcat(result, " "); + i++; } - return (0); + free(tokens); + return (result); +} + +char *process_and_reassemble(char *line, t_ms_data *data) +{ + char **tokens; + size_t result_len; + int i; + char *processed_token; + + tokens = ft_split(line, ' '); + if (!tokens) + return (NULL); + result_len = 0; + i = 0; + while (tokens[i]) + { + processed_token = expand_env_and_loc_var(tokens[i], data); + free(tokens[i]); + tokens[i] = processed_token; + result_len += ft_strlen(tokens[i]) + 1; + i++; + } + return (assemble_result(tokens, result_len)); } int redirect_here_doc(t_ast *node, t_ms_data *data) @@ -46,21 +80,19 @@ int redirect_here_doc(t_ast *node, t_ms_data *data) char *line; char *eof; int file_fd; - int in_quotes; line = NULL; if (node->right->args[0] == NULL) return (1); file_fd = open_tmp_file("w"); eof = ft_strdup(node->right->args[0]); - in_quotes = is_in_quotes(eof); - line = readline("> "); + line = process_and_reassemble(readline("> "), data); while (line && (ft_strcmp(line, eof) != 0)) { write(file_fd, line, ft_strlen(line)); write(file_fd, "\n", 1); free(line); - line = readline("> "); + line = process_and_reassemble(readline("> "), data); } free(line); free(eof); diff --git a/src/shell_variables/shell_variables.c b/src/shell_variables/shell_variables.c index 7c845401..03f9101c 100644 --- a/src/shell_variables/shell_variables.c +++ b/src/shell_variables/shell_variables.c @@ -1,51 +1,71 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shell_variables.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dmdemirk -int handle_add_set_shell_variable(t_env **shell_var, char *line); -int handle_get_shell_variable(t_ms_data *data, const char *key); -int handle_shell_variable(t_ast *node, t_ms_data *data); +int handle_add_set_shell_variable(t_env **shell_var, char *line); +int handle_get_shell_variable(t_ms_data *data, const char *key); +int handle_shell_variable(t_ast *node, t_ms_data *data); +void shell_variable_update(t_ms_data *data, int status); -int handle_add_set_shell_variable(t_env **shell_var, char *line) +int handle_add_set_shell_variable(t_env **shell_var, char *line) { - char *key; - char *value; - - key = NULL; - value = NULL; - if (*shell_var == NULL) - add_shell_var_node(shell_var, line); - else - { - key = ft_strcdup(line, '='); - value = ft_strchr(line, '=') + 1; - set_shell_var(shell_var, key, value); - free(key); - } - return (0); + char *key; + char *value; + + key = NULL; + value = NULL; + if (*shell_var == NULL) + add_shell_var_node(shell_var, line); + else + { + key = ft_strcdup(line, '='); + value = ft_strchr(line, '=') + 1; + set_shell_var(shell_var, key, value); + printf("value: %s\n", get_env(*shell_var, key)); + free(key); + } + return (0); } -int handle_get_shell_variable(t_ms_data *data, const char *key) +int handle_get_shell_variable(t_ms_data *data, const char *key) { - char *value; - t_env *shell_var; - - shell_var = data->shell_variables; - value = get_env(shell_var, key); - if (value) - { - ft_putstr_fd(value, data->std_out); - ft_putstr_fd("\n", data->std_out); - return (0); - } - return (-1); + char *value; + t_env *shell_var; + + shell_var = data->shell_variables; + value = get_env(shell_var, key); + if (value) + { + ft_putstr_fd(value, data->std_out); + ft_putstr_fd("\n", data->std_out); + return (0); + } + return (-1); } -int handle_shell_variable(t_ast *node, t_ms_data *data) +int handle_shell_variable(t_ast *node, t_ms_data *data) { - if (node->left && node->right == NULL) - return (handle_get_shell_variable(data, node->args[0])); - return (-1); -} \ No newline at end of file + if (node->left && node->right == NULL) + return (handle_get_shell_variable(data, node->args[0])); + return (-1); +} + +void shell_variable_update(t_ms_data *data, int status) +{ + data->exit_status = status; + set_shell_var(&data->shell_variables, "?", ft_itoa(status)); +} diff --git a/src/shell_variables/shell_variables_utils.c b/src/shell_variables/shell_variables_utils.c index 96221884..b4c53fe9 100644 --- a/src/shell_variables/shell_variables_utils.c +++ b/src/shell_variables/shell_variables_utils.c @@ -1,3 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* shell_variables_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dmdemirk void set_shell_var(t_env **shell_var, const char *key, const char *value); -void add_shell_var_node(t_env **shell_var, const char *line); +void add_shell_var_node(t_env **shell_var, const char *line); char *get_shell_variable(t_env *shell_var, const char *key); -void add_shell_var_node(t_env **shell_var, const char *line) +void add_shell_var_node(t_env **shell_var, const char *line) { - t_env *new_node; + t_env *new_node; t_env *curr_node; char *key; char *value; @@ -37,13 +49,12 @@ void add_shell_var_node(t_env **shell_var, const char *line) curr_node->next = new_node; } - void set_shell_var(t_env **shell_var, const char *key, const char *value) { t_env *current; t_env *new_env; - current = *shell_var; + current = *shell_var; while (current) { if (ft_strcmp(current->key, key) == 0) @@ -73,4 +84,4 @@ char *get_shell_variable(t_env *shell_var, const char *key) curr_node = curr_node->next; } return (NULL); -} \ No newline at end of file +} diff --git a/src/utils/initialise.c b/src/utils/initialise.c index b210e1e8..dfb6e0b3 100644 --- a/src/utils/initialise.c +++ b/src/utils/initialise.c @@ -6,7 +6,7 @@ /* By: rmikhayl +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/06 18:16:59 by rmikhayl #+# #+# */ -/* Updated: 2024/07/18 15:58:43 by dmdemirk ### ########.fr */ +/* Updated: 2024/09/06 12:00:14 by dmdemirk ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,10 +14,10 @@ #include "env.h" #include "signals.h" -void init_ms_data(t_ms_data *data,char **argv, char **envp); +void init_ms_data(t_ms_data *data, char **argv, char **envp); void initialise(int argc, char **argv); -void init_ms_data(t_ms_data *data,char **argv, char **envp) +void init_ms_data(t_ms_data *data, char **argv, char **envp) { (void)argv; data->args = NULL;