From f14eb59ac9d16691f68291a1a8702559b50ab81c Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 16:16:46 +0900 Subject: [PATCH 01/12] =?UTF-8?q?makefile=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 18f196e..84f874b 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,10 @@ # ::: :::::::: # # Makefile :+: :+: :+: # # +:+ +:+ +:+ # -# By: dayano +#+ +:+ +#+ # +# By: ttsubo +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2025/04/03 12:55:20 by ttsubo #+# #+# # -# Updated: 2025/04/29 16:48:58 by dayano ### ########.fr # +# Updated: 2025/05/02 16:16:40 by ttsubo ### ########.fr # # # # **************************************************************************** # @@ -87,8 +87,8 @@ $(foreach DIR,$(MODULE_DIRS), \ clean: $(MAKE) -C $(FT_DIR) clean - find $(OBJ_DIR) -type f -name '*.o' -exec rm -f {} + - find $(OBJ_DIR) -type d -empty -not -name '.' -exec rmdir {} + + [ -d $(OBJ_DIR) ] && find $(OBJ_DIR) -type f -name '*.o' -exec rm -f {} + || true + [ -d $(OBJ_DIR) ] && find $(OBJ_DIR) -type d -empty -not -name '.' -exec rmdir {} + || true fclean: $(MAKE) -C $(FT_DIR) fclean From 6be680bd4d302ed474155dc6fa58d075b68e8d4d Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 16:17:31 +0900 Subject: [PATCH 02/12] =?UTF-8?q?allocate=E7=94=A8=E3=81=AE=E4=BE=BF?= =?UTF-8?q?=E5=88=A9=E9=96=A2=E6=95=B0=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/parser.h | 7 ++++- src/parser/allocate_cmds_utils.c | 51 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/parser/allocate_cmds_utils.c diff --git a/inc/parser.h b/inc/parser.h index fb46d8d..6fbc05c 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:59 by ttsubo #+# #+# */ -/* Updated: 2025/04/29 12:17:18 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 16:14:02 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,11 @@ # include "libft.h" # include "expand_env.h" +t_cmd **calloc_cmds(char **tokens); +t_cmd *calloc_cmd(void); +char **calloc_argv(char **tokens); +char *calloc_arg(char *token); + t_cmd **parser(char **tokens, t_minish *minish); void set_cmd_type(t_cmd *cmd, char *token); size_t cmds_len(t_cmd **cmds); diff --git a/src/parser/allocate_cmds_utils.c b/src/parser/allocate_cmds_utils.c new file mode 100644 index 0000000..5d532d5 --- /dev/null +++ b/src/parser/allocate_cmds_utils.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* allocate_cmds_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ttsubo +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ +/* Updated: 2025/05/02 16:12:47 by ttsubo ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser.h" + +t_cmd **calloc_cmds(char **tokens) +{ + t_cmd **cmds; + size_t cmd_i; + size_t token_i; + + token_i = 0; + cmd_i = 1; + while (tokens[token_i]) + { + if (is_separator(tokens[token_i])) + cmd_i++; + token_i++; + } + cmds = ft_calloc(sizeof(t_cmd*), cmd_i + 1); + return (cmds); +} + +t_cmd *calloc_cmd(void) +{ + return (ft_calloc(sizeof(t_cmd), 1)); +} + +char **calloc_argv(char **tokens) +{ + size_t token_i; + + token_i = 0; + while (tokens[token_i] && !is_separator(tokens[token_i])) + token_i++; + return (ft_calloc(sizeof(char *), token_i + 1)); +} + +char *calloc_arg(char *token) +{ + return (ft_strdup(token)); +} From 2eb8fa9d3a54c2218b81b58815177bc4860988fe Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 16:18:01 +0900 Subject: [PATCH 03/12] =?UTF-8?q?allocate=E7=94=A8=E3=81=AE=E4=BE=BF?= =?UTF-8?q?=E5=88=A9=E9=96=A2=E6=95=B0=E8=BF=BD=E5=8A=A0=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E6=BC=8F=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/allocate_cmds_utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser/allocate_cmds_utils.c b/src/parser/allocate_cmds_utils.c index 5d532d5..650c42b 100644 --- a/src/parser/allocate_cmds_utils.c +++ b/src/parser/allocate_cmds_utils.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 16:12:47 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 16:17:27 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,7 @@ t_cmd **calloc_cmds(char **tokens) cmd_i++; token_i++; } - cmds = ft_calloc(sizeof(t_cmd*), cmd_i + 1); + cmds = ft_calloc(sizeof(t_cmd *), cmd_i + 1); return (cmds); } From 7ea60c238780568cbad1bbcb9201f687d27cf1e8 Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 17:03:41 +0900 Subject: [PATCH 04/12] =?UTF-8?q?allocate=5Fcmds=E3=82=92=E5=A4=A7?= =?UTF-8?q?=E5=B9=85=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 +- inc/parser.h | 5 ++- src/parser/allocate_cmds.c | 71 ++++++++++++++++++------------ src/parser/allocate_cmds_utils.c | 12 ++++- src/parser/allocate_cmds_utils_2.c | 29 ++++++++++++ src/parser/parser_utils.c | 12 ++++- 6 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 src/parser/allocate_cmds_utils_2.c diff --git a/Makefile b/Makefile index 84f874b..b6dddc3 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: ttsubo +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2025/04/03 12:55:20 by ttsubo #+# #+# # -# Updated: 2025/05/02 16:16:40 by ttsubo ### ########.fr # +# Updated: 2025/05/02 17:03:29 by ttsubo ### ########.fr # # # # **************************************************************************** # @@ -54,7 +54,7 @@ INVOKE_CMD_SRC = create_envp.c exec_pipeline.c execute_cmd.c \ TOKENIZER_SRC = tokenizer.c tokenizer_error.c read_token.c \ is_quote_closed.c get_token_capa.c is_redirect_validate.c PARSER_SRC = allocate_cmds.c parser.c parser_utils.c setup_cmds.c \ - expand_env.c + expand_env.c allocate_cmds_utils.c allocate_cmds_utils_2.c BUILTIN_SRC = cd.c exit.c pwd.c echo.c env.c unset.c export.c \ env_utils.c env_utils_2.c env_utils_3.c builtin_utils.c \ export_exec.c export_print_sorted_env.c export_error.c diff --git a/inc/parser.h b/inc/parser.h index 6fbc05c..f8f72ae 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:59 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 16:14:02 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 16:59:11 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,8 @@ # include "libft.h" # include "expand_env.h" +size_t count_cmds(char **tokens); +char **next_cmd_start(char **token_ptr); t_cmd **calloc_cmds(char **tokens); t_cmd *calloc_cmd(void); char **calloc_argv(char **tokens); @@ -25,6 +27,7 @@ char *calloc_arg(char *token); t_cmd **parser(char **tokens, t_minish *minish); void set_cmd_type(t_cmd *cmd, char *token); size_t cmds_len(t_cmd **cmds); +size_t count_args_until_separator(char **tokens); int is_separator(char *token); void free_cmds(t_cmd **cmds, size_t count); t_cmd **allocate_cmds(char **tokens); diff --git a/src/parser/allocate_cmds.c b/src/parser/allocate_cmds.c index db73bf7..1f1c16e 100644 --- a/src/parser/allocate_cmds.c +++ b/src/parser/allocate_cmds.c @@ -6,56 +6,69 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ -/* Updated: 2025/04/26 20:39:41 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 17:02:35 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" -static size_t _count_cmds(char **tokens) +static int _allocate_argv(t_cmd *cmd, char **token_ptr) { - size_t i; - size_t cmd_count; + size_t arg_i; + size_t len; - i = 0; - cmd_count = 1; - while (tokens[i]) + cmd->argv = calloc_argv(token_ptr); + if (!cmd->argv) + return (1); + arg_i = 0; + len = count_args_until_separator(token_ptr); + while (arg_i < len) { - if (is_separator(tokens[i])) - cmd_count++; - i++; + cmd->argv[arg_i] = calloc_arg(token_ptr[arg_i]); + if (!cmd->argv[arg_i]) + { + while (0 < arg_i) + free(cmd->argv[--arg_i]); + free(cmd->argv); + return (1); + } + arg_i++; } - return (cmd_count); + return (0); } -static t_cmd **_allocate_cmds(size_t count) +static t_cmd *_allocate_cmd(char **token_ptr) { - size_t i; - t_cmd **cmds; + t_cmd *cmd; - i = 0; - cmds = ft_calloc(count + 1, sizeof(t_cmd *)); - if (!cmds) + cmd = calloc_cmd(); + if (!cmd) return (NULL); - while (i < count) - { - cmds[i] = ft_calloc(1, sizeof(t_cmd)); - if (!cmds[i]) - return (free_cmds(cmds, i), NULL); - if (i > 0) - cmds[i - 1]->next = cmds[i]; - i++; - } - cmds[i] = NULL; - return (cmds); + if (_allocate_argv(cmd, token_ptr)) + return (free(cmd), NULL); + return (cmd); } t_cmd **allocate_cmds(char **tokens) { + char **token_ptr; t_cmd **cmds; + size_t cmd_i; + size_t len; - cmds = _allocate_cmds(_count_cmds(tokens)); + cmds = calloc_cmds(tokens); if (!cmds) return (NULL); + cmd_i = 0; + len = count_cmds(tokens); + token_ptr = tokens; + while (cmd_i < len) + { + cmds[cmd_i] = _allocate_cmd(token_ptr); + if (!cmds[cmd_i]) + return (free_cmds(cmds, cmd_i), NULL); + token_ptr = next_cmd_start(token_ptr); + cmd_i++; + } return (cmds); } diff --git a/src/parser/allocate_cmds_utils.c b/src/parser/allocate_cmds_utils.c index 650c42b..bf9630a 100644 --- a/src/parser/allocate_cmds_utils.c +++ b/src/parser/allocate_cmds_utils.c @@ -6,12 +6,22 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 16:17:27 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 16:35:17 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" +char **next_cmd_start(char **token_ptr) +{ + size_t token_i; + + token_i = 0; + while (token_ptr[token_i] && !is_separator(token_ptr[token_i])) + token_i++; + return (&token_ptr[token_i]); +} + t_cmd **calloc_cmds(char **tokens) { t_cmd **cmds; diff --git a/src/parser/allocate_cmds_utils_2.c b/src/parser/allocate_cmds_utils_2.c new file mode 100644 index 0000000..56cc57d --- /dev/null +++ b/src/parser/allocate_cmds_utils_2.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* allocate_cmds_utils_2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ttsubo +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ +/* Updated: 2025/05/02 16:58:45 by ttsubo ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser.h" + +size_t count_cmds(char **tokens) +{ + size_t i; + size_t count; + + i = 0; + count = 1; + while (tokens[i]) + { + if (is_separator(tokens[i])) + count++; + i++; + } + return (count); +} diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c index 3a4adbd..3a76ca3 100644 --- a/src/parser/parser_utils.c +++ b/src/parser/parser_utils.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 13:40:56 by ttsubo #+# #+# */ -/* Updated: 2025/04/29 12:16:53 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 16:48:32 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,6 +26,16 @@ void set_cmd_type(t_cmd *cmd, char *token) cmd->type = REDIR_NONE; } +size_t count_args_until_separator(char **tokens) +{ + size_t i; + + i = 0; + while (tokens[i] && !is_separator(tokens[i])) + i++; + return (i); +} + size_t cmds_len(t_cmd **cmds) { size_t i; From 6a063df4c7d7c8a1170d155335373c2c66756cb2 Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 17:22:57 +0900 Subject: [PATCH 05/12] =?UTF-8?q?=E4=BA=8B=E5=89=8D=E3=81=AB=E7=92=B0?= =?UTF-8?q?=E5=A2=83=E5=A4=89=E6=95=B0=E3=82=92=E5=B1=95=E9=96=8B=E3=81=99?= =?UTF-8?q?=E3=82=8Bexpand=5Ftokens=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 5 ++-- inc/parser.h | 5 ++-- src/parser/expand_tokens.c | 49 ++++++++++++++++++++++++++++++++++++++ src/parser/parser.c | 18 ++++++++------ 4 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 src/parser/expand_tokens.c diff --git a/Makefile b/Makefile index b6dddc3..d538334 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: ttsubo +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2025/04/03 12:55:20 by ttsubo #+# #+# # -# Updated: 2025/05/02 17:03:29 by ttsubo ### ########.fr # +# Updated: 2025/05/02 17:20:26 by ttsubo ### ########.fr # # # # **************************************************************************** # @@ -54,7 +54,8 @@ INVOKE_CMD_SRC = create_envp.c exec_pipeline.c execute_cmd.c \ TOKENIZER_SRC = tokenizer.c tokenizer_error.c read_token.c \ is_quote_closed.c get_token_capa.c is_redirect_validate.c PARSER_SRC = allocate_cmds.c parser.c parser_utils.c setup_cmds.c \ - expand_env.c allocate_cmds_utils.c allocate_cmds_utils_2.c + allocate_cmds_utils.c allocate_cmds_utils_2.c \ + expand_env.c expand_tokens.c BUILTIN_SRC = cd.c exit.c pwd.c echo.c env.c unset.c export.c \ env_utils.c env_utils_2.c env_utils_3.c builtin_utils.c \ export_exec.c export_print_sorted_env.c export_error.c diff --git a/inc/parser.h b/inc/parser.h index f8f72ae..cda4eaf 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:59 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 16:59:11 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 17:19:32 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,8 @@ # define PARSER_H # include "cmd.h" -# include "libft.h" # include "expand_env.h" +# include "libft.h" size_t count_cmds(char **tokens); char **next_cmd_start(char **token_ptr); @@ -25,6 +25,7 @@ char **calloc_argv(char **tokens); char *calloc_arg(char *token); t_cmd **parser(char **tokens, t_minish *minish); +char **expand_tokens(char **tokens, t_minish *minish); void set_cmd_type(t_cmd *cmd, char *token); size_t cmds_len(t_cmd **cmds); size_t count_args_until_separator(char **tokens); diff --git a/src/parser/expand_tokens.c b/src/parser/expand_tokens.c new file mode 100644 index 0000000..a74ce2c --- /dev/null +++ b/src/parser/expand_tokens.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expand_tokens.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ttsubo +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/02 17:08:42 by ttsubo #+# #+# */ +/* Updated: 2025/05/02 17:22:05 by ttsubo ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser.h" + +static size_t _tokens_len(char **tokens) +{ + size_t i; + + i = 0; + while (tokens[i]) + i++; + return (i); +} + +char **expand_tokens(char **tokens, t_minish *minish) +{ + size_t token_i; + size_t len; + char **expanded; + + len = _tokens_len(tokens); + expanded = ft_calloc(sizeof(char *), len + 1); + if (!expanded) + return (NULL); + token_i = 0; + while (token_i < len) + { + expanded[token_i] = expand_env(tokens[token_i], minish); + if (!expanded[token_i]) + { + while (0 < token_i) + free(expanded[--token_i]); + free(expanded); + return (NULL); + } + token_i++; + } + return (expanded); +} diff --git a/src/parser/parser.c b/src/parser/parser.c index c37d81d..c0054f9 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -6,26 +6,30 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:32 by ttsubo #+# #+# */ -/* Updated: 2025/04/26 11:48:00 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 17:18:40 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" /** - * @brief - * - * @param tokens - * @return t_cmd** + * @brief + * + * @param tokens + * @return t_cmd** */ t_cmd **parser(char **tokens, t_minish *minish) { + char **expanded_tokens; t_cmd **cmds; - cmds = allocate_cmds(tokens); + expanded_tokens = expand_tokens(tokens, minish); + if (!expanded_tokens) + return (NULL); + cmds = allocate_cmds(expanded_tokens); if (!cmds) return (NULL); - cmds = setup_cmds(cmds, tokens, minish); + cmds = setup_cmds(cmds, expanded_tokens, minish); if (!cmds) return (NULL); return (cmds); From cda51c435e52528597edc6ca659a110689e7180e Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 17:53:27 +0900 Subject: [PATCH 06/12] =?UTF-8?q?$=E3=82=82=E5=B1=95=E9=96=8B=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/expand_tokens.c | 47 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/parser/expand_tokens.c b/src/parser/expand_tokens.c index a74ce2c..2bd0a83 100644 --- a/src/parser/expand_tokens.c +++ b/src/parser/expand_tokens.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/02 17:08:42 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 17:22:05 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 17:52:43 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,49 @@ static size_t _tokens_len(char **tokens) return (i); } +/** + * @note pre: $? in str + */ +static char *_expand_dollar(char *str, t_minish *minish) +{ + char *pre; + char *suf; + char *sts_str; + char *joined; + char *final; + + pre = ft_substr(str, 0, ft_strlen_until(str, '$')); + sts_str = ft_itoa(minish->last_status); + suf = ft_strdup(str + ft_strlen_until(str, '$') + 2); + if (!pre || !sts_str || !suf) + return (free(pre), free(sts_str), free(suf), NULL); + joined = ft_strjoin(pre, sts_str); + final = ft_strjoin(joined, suf); + return (free(pre), free(sts_str), free(suf), free(joined), final); +} + +static char *_expand(char *token, t_minish *minish) +{ + char *result; + char *tmp; + + result = ft_strdup(token); + if (!result) + return (NULL); + while (ft_strchr(result, '$')) + { + tmp = result; + if (ft_strnstr(result, "$?", ft_strlen(result))) + result = _expand_dollar(tmp, minish); + else + result = expand_env(tmp, minish); + free(tmp); + if (!result) + return (NULL); + } + return (result); +} + char **expand_tokens(char **tokens, t_minish *minish) { size_t token_i; @@ -35,7 +78,7 @@ char **expand_tokens(char **tokens, t_minish *minish) token_i = 0; while (token_i < len) { - expanded[token_i] = expand_env(tokens[token_i], minish); + expanded[token_i] = _expand(tokens[token_i], minish); if (!expanded[token_i]) { while (0 < token_i) From fa47155607c7ea90f5697d47188695bee238e6ec Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 17:57:55 +0900 Subject: [PATCH 07/12] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=81=A3=E3=81=9F=E3=82=B3=E3=83=9E=E3=83=B3=E3=83=89=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/parser.h | 4 +- src/parser/parser.c | 4 +- src/parser/setup_cmds.c | 83 ++--------------------------------------- 3 files changed, 7 insertions(+), 84 deletions(-) diff --git a/inc/parser.h b/inc/parser.h index cda4eaf..714cbbc 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:59 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 17:19:32 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 17:56:17 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,6 +32,6 @@ size_t count_args_until_separator(char **tokens); int is_separator(char *token); void free_cmds(t_cmd **cmds, size_t count); t_cmd **allocate_cmds(char **tokens); -t_cmd **setup_cmds(t_cmd **cmds, char **tokens, t_minish *minish); +t_cmd **setup_cmds(t_cmd **cmds, char **tokens); #endif \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index c0054f9..93197e5 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:32 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 17:18:40 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 17:55:50 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ t_cmd **parser(char **tokens, t_minish *minish) cmds = allocate_cmds(expanded_tokens); if (!cmds) return (NULL); - cmds = setup_cmds(cmds, expanded_tokens, minish); + cmds = setup_cmds(cmds, expanded_tokens); if (!cmds) return (NULL); return (cmds); diff --git a/src/parser/setup_cmds.c b/src/parser/setup_cmds.c index 527270d..0e2a860 100644 --- a/src/parser/setup_cmds.c +++ b/src/parser/setup_cmds.c @@ -6,82 +6,12 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 13:38:36 by ttsubo #+# #+# */ -/* Updated: 2025/04/29 12:56:28 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 17:55:38 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" -static int _allocate_argv(t_cmd *cmd, char **tokens) -{ - size_t token_i; - size_t argc; - - token_i = 0; - argc = 0; - while (tokens[token_i] && !is_separator(tokens[token_i])) - { - token_i++; - argc++; - } - cmd->argv = ft_calloc(argc + 1, sizeof(char *)); - if (!cmd->argv) - return (1); - return (0); -} - -static char *_expand_dollar(char *str, t_minish *minish, size_t i) -{ - char *pre; - char *suf; - char *sts_str; - char *joined; - char *final; - - if (str[i + 1] && str[i + 1] == '?') - { - pre = ft_substr(str, 0, i); - sts_str = ft_itoa(minish->last_status); - suf = ft_strdup(str + i + 2); - if (!pre || !sts_str || !suf) - return (free(pre), free(sts_str), free(suf), NULL); - joined = ft_strjoin(pre, sts_str); - final = ft_strjoin(joined, suf); - return (free(pre), free(sts_str), free(suf), free(joined), final); - } - else - return (expand_env(str, minish)); -} - -static char *_expand_arg(char *token, t_minish *minish) -{ - size_t token_i; - bool is_squote; - char *result; - char *expanded; - - token_i = 0; - is_squote = 0; - result = ft_strdup(token); - while (result[token_i]) - { - if (result[token_i] == '\'') - is_squote = !is_squote; - if (!is_squote && result[token_i] == '$') - { - expanded = _expand_dollar(result, minish, token_i); - if (!expanded) - return (result); - free(result); - result = expanded; - token_i = 0; - continue ; - } - token_i++; - } - return (result); -} - static void _next_cmd(t_cmd **cmds, size_t *cmd_i, size_t *arg_i, char *token) { cmds[*cmd_i]->argv[*arg_i] = NULL; @@ -89,10 +19,9 @@ static void _next_cmd(t_cmd **cmds, size_t *cmd_i, size_t *arg_i, char *token) (*arg_i) = 0; (*cmd_i)++; set_cmd_type(cmds[*cmd_i], token); - _allocate_argv(cmds[*cmd_i], &token); } -t_cmd **setup_cmds(t_cmd **cmds, char **tokens, t_minish *minish) +t_cmd **setup_cmds(t_cmd **cmds, char **tokens) { size_t token_i; size_t cmd_i; @@ -102,18 +31,12 @@ t_cmd **setup_cmds(t_cmd **cmds, char **tokens, t_minish *minish) cmd_i = 0; arg_i = 0; set_cmd_type(cmds[0], tokens[token_i]); - _allocate_argv(cmds[0], tokens); while (tokens[token_i]) { if (is_separator(tokens[token_i])) _next_cmd(cmds, &cmd_i, &arg_i, tokens[token_i]); else - { - cmds[cmd_i]->argv[arg_i] = _expand_arg(tokens[token_i], minish); - if (!cmds[cmd_i]->argv[arg_i]) - return (free_cmds(cmds, cmds_len(cmds)), NULL); - arg_i++; - } + cmds[cmd_i]->argv[arg_i++] = tokens[token_i]; token_i++; } cmds[cmd_i]->argc = arg_i; From 1f11e57e5e0599e5a1690640f66d3e78eb4ce46a Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 18:22:52 +0900 Subject: [PATCH 08/12] =?UTF-8?q?token=E3=81=AE=E7=AE=A1=E7=90=86=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/allocate_cmds_utils.c | 4 +++- src/parser/setup_cmds.c | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/parser/allocate_cmds_utils.c b/src/parser/allocate_cmds_utils.c index bf9630a..94cdf87 100644 --- a/src/parser/allocate_cmds_utils.c +++ b/src/parser/allocate_cmds_utils.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 16:35:17 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 18:12:06 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,8 @@ char **next_cmd_start(char **token_ptr) token_i = 0; while (token_ptr[token_i] && !is_separator(token_ptr[token_i])) token_i++; + if (token_ptr[token_i]) + token_i++; return (&token_ptr[token_i]); } diff --git a/src/parser/setup_cmds.c b/src/parser/setup_cmds.c index 0e2a860..4c602d0 100644 --- a/src/parser/setup_cmds.c +++ b/src/parser/setup_cmds.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 13:38:36 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 17:55:38 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 18:18:00 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,6 +40,5 @@ t_cmd **setup_cmds(t_cmd **cmds, char **tokens) token_i++; } cmds[cmd_i]->argc = arg_i; - cmds[++cmd_i] = NULL; return (cmds); } From 2f8457a3d859b55dae7057cf0e3ce8ba601ce0ab Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 18:45:06 +0900 Subject: [PATCH 09/12] =?UTF-8?q?next=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/allocate_cmds.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/parser/allocate_cmds.c b/src/parser/allocate_cmds.c index 1f1c16e..6d2fa7c 100644 --- a/src/parser/allocate_cmds.c +++ b/src/parser/allocate_cmds.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 17:02:35 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 18:43:34 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -67,6 +67,8 @@ t_cmd **allocate_cmds(char **tokens) cmds[cmd_i] = _allocate_cmd(token_ptr); if (!cmds[cmd_i]) return (free_cmds(cmds, cmd_i), NULL); + if (cmd_i > 0) + cmds[cmd_i - 1]->next = cmds[cmd_i]; token_ptr = next_cmd_start(token_ptr); cmd_i++; } From c0b398dd178e6ef43b25996f051c075f0cdd2426 Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 19:08:27 +0900 Subject: [PATCH 10/12] =?UTF-8?q?free=E5=87=A6=E7=90=86=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/parser.c | 19 ++++++++++++++++--- src/parser/setup_cmds.c | 9 +++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/parser/parser.c b/src/parser/parser.c index 93197e5..242a4b5 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -6,12 +6,24 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:32 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 17:55:50 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 19:08:14 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" +static void _free_tokens(char **tokens) +{ + size_t token_i; + + token_i = 0; + while (tokens[token_i]) + token_i++; + while (0 < token_i) + free(tokens[--token_i]); + free(tokens); +} + /** * @brief * @@ -28,9 +40,10 @@ t_cmd **parser(char **tokens, t_minish *minish) return (NULL); cmds = allocate_cmds(expanded_tokens); if (!cmds) - return (NULL); + return (_free_tokens(expanded_tokens), NULL); cmds = setup_cmds(cmds, expanded_tokens); if (!cmds) - return (NULL); + return (_free_tokens(expanded_tokens), NULL); + _free_tokens(expanded_tokens); return (cmds); } diff --git a/src/parser/setup_cmds.c b/src/parser/setup_cmds.c index 4c602d0..b7d8003 100644 --- a/src/parser/setup_cmds.c +++ b/src/parser/setup_cmds.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 13:38:36 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 18:18:00 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 18:59:44 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -36,7 +36,12 @@ t_cmd **setup_cmds(t_cmd **cmds, char **tokens) if (is_separator(tokens[token_i])) _next_cmd(cmds, &cmd_i, &arg_i, tokens[token_i]); else - cmds[cmd_i]->argv[arg_i++] = tokens[token_i]; + { + cmds[cmd_i]->argv[arg_i] = ft_strdup(tokens[token_i]); + if (!cmds[cmd_i]->argv[arg_i]) + return (free_cmds(cmds, cmd_i), NULL); + arg_i++; + } token_i++; } cmds[cmd_i]->argc = arg_i; From 6a036deaf999b432e820783ec8e21ac8ce7b2101 Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 20:32:14 +0900 Subject: [PATCH 11/12] =?UTF-8?q?last=5Fstatus=E3=82=92free=E3=81=97?= =?UTF-8?q?=E3=81=9F=E3=81=82=E3=81=A8=E3=81=AE=E6=A7=8B=E9=80=A0=E4=BD=93?= =?UTF-8?q?=E3=81=8B=E3=82=89=E6=B8=A1=E3=81=95=E3=81=AA=E3=81=84=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index d3307c7..a7297af 100644 --- a/src/main.c +++ b/src/main.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dayano +#+ +:+ +#+ */ +/* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/03 12:50:11 by ttsubo #+# #+# */ -/* Updated: 2025/04/29 13:06:39 by dayano ### ########.fr */ +/* Updated: 2025/05/02 20:30:23 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -70,6 +70,7 @@ int main(int argc, char **argv, char **envp) { t_minish *minish; char *program_name; + int last_status; (void)argc; program_name = argv[0]; @@ -77,6 +78,7 @@ int main(int argc, char **argv, char **envp) minish_signal(); while (prompt(program_name, minish)) ; + last_status = minish->last_status; destroy_minish(minish); - return (minish->last_status); + return (last_status); } From 32d33791ced05da004b9c325e2ec5d6b08ceb815 Mon Sep 17 00:00:00 2001 From: cacapon Date: Fri, 2 May 2025 21:28:19 +0900 Subject: [PATCH 12/12] =?UTF-8?q?parser=E3=81=AEfree=E9=96=A2=E9=80=A3?= =?UTF-8?q?=E3=81=AE=E3=82=B3=E3=83=9E=E3=83=B3=E3=83=89=E3=82=92=E3=81=B2?= =?UTF-8?q?=E3=81=A8=E3=81=BE=E3=81=A8=E3=82=81=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 ++-- inc/parser.h | 4 ++-- inc/parser_free.h | 20 +++++++++++++++++ src/main.c | 4 ++-- src/parser/allocate_cmds.c | 4 ++-- src/parser/parser.c | 20 ++++------------- src/parser/parser_free.c | 46 ++++++++++++++++++++++++++++++++++++++ src/parser/parser_utils.c | 20 +---------------- src/parser/setup_cmds.c | 4 ++-- 9 files changed, 81 insertions(+), 45 deletions(-) create mode 100644 inc/parser_free.h create mode 100644 src/parser/parser_free.c diff --git a/Makefile b/Makefile index d538334..2ec2acf 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: ttsubo +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2025/04/03 12:55:20 by ttsubo #+# #+# # -# Updated: 2025/05/02 17:20:26 by ttsubo ### ########.fr # +# Updated: 2025/05/02 21:24:45 by ttsubo ### ########.fr # # # # **************************************************************************** # @@ -53,7 +53,7 @@ INVOKE_CMD_SRC = create_envp.c exec_pipeline.c execute_cmd.c \ redirect.c fds.c wait_pipeline.c TOKENIZER_SRC = tokenizer.c tokenizer_error.c read_token.c \ is_quote_closed.c get_token_capa.c is_redirect_validate.c -PARSER_SRC = allocate_cmds.c parser.c parser_utils.c setup_cmds.c \ +PARSER_SRC = allocate_cmds.c parser.c parser_free.c parser_utils.c setup_cmds.c \ allocate_cmds_utils.c allocate_cmds_utils_2.c \ expand_env.c expand_tokens.c BUILTIN_SRC = cd.c exit.c pwd.c echo.c env.c unset.c export.c \ diff --git a/inc/parser.h b/inc/parser.h index 714cbbc..46c39aa 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:59 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 17:56:17 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 21:25:06 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ # define PARSER_H # include "cmd.h" +# include "parser_free.h" # include "expand_env.h" # include "libft.h" @@ -30,7 +31,6 @@ void set_cmd_type(t_cmd *cmd, char *token); size_t cmds_len(t_cmd **cmds); size_t count_args_until_separator(char **tokens); int is_separator(char *token); -void free_cmds(t_cmd **cmds, size_t count); t_cmd **allocate_cmds(char **tokens); t_cmd **setup_cmds(t_cmd **cmds, char **tokens); diff --git a/inc/parser_free.h b/inc/parser_free.h new file mode 100644 index 0000000..dbd2fe4 --- /dev/null +++ b/inc/parser_free.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_free.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ttsubo +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/02 21:22:56 by ttsubo #+# #+# */ +/* Updated: 2025/05/02 21:27:46 by ttsubo ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PARSER_FREE_H +# define PARSER_FREE_H + +void free_tokens(char **tokens); +void free_cmd(t_cmd *cmd); +void free_cmds(t_cmd **cmds); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index a7297af..95e9423 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/03 12:50:11 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 20:30:23 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 21:25:49 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -61,7 +61,7 @@ static bool prompt(char *program_name, t_minish *minish) if (cmds[0]->argc > 0) minish->last_status = invoke_commands(cmds[0], minish); _free_tokens(tokens); - free_cmds(cmds, cmds_len(cmds)); + free_cmds(cmds); free(line); return (true); } diff --git a/src/parser/allocate_cmds.c b/src/parser/allocate_cmds.c index 6d2fa7c..36dab42 100644 --- a/src/parser/allocate_cmds.c +++ b/src/parser/allocate_cmds.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 12:19:28 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 18:43:34 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 21:26:21 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -66,7 +66,7 @@ t_cmd **allocate_cmds(char **tokens) { cmds[cmd_i] = _allocate_cmd(token_ptr); if (!cmds[cmd_i]) - return (free_cmds(cmds, cmd_i), NULL); + return (free_cmds(cmds), NULL); if (cmd_i > 0) cmds[cmd_i - 1]->next = cmds[cmd_i]; token_ptr = next_cmd_start(token_ptr); diff --git a/src/parser/parser.c b/src/parser/parser.c index 242a4b5..6657ade 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -6,24 +6,12 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 14:14:32 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 19:08:14 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 21:27:58 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ #include "parser.h" -static void _free_tokens(char **tokens) -{ - size_t token_i; - - token_i = 0; - while (tokens[token_i]) - token_i++; - while (0 < token_i) - free(tokens[--token_i]); - free(tokens); -} - /** * @brief * @@ -40,10 +28,10 @@ t_cmd **parser(char **tokens, t_minish *minish) return (NULL); cmds = allocate_cmds(expanded_tokens); if (!cmds) - return (_free_tokens(expanded_tokens), NULL); + return (free_tokens(expanded_tokens), NULL); cmds = setup_cmds(cmds, expanded_tokens); if (!cmds) - return (_free_tokens(expanded_tokens), NULL); - _free_tokens(expanded_tokens); + return (free_tokens(expanded_tokens), NULL); + free_tokens(expanded_tokens); return (cmds); } diff --git a/src/parser/parser_free.c b/src/parser/parser_free.c new file mode 100644 index 0000000..e302337 --- /dev/null +++ b/src/parser/parser_free.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* parser_free.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: ttsubo +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/02 20:55:39 by ttsubo #+# #+# */ +/* Updated: 2025/05/02 21:28:08 by ttsubo ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "parser.h" + +void free_tokens(char **tokens) +{ + size_t token_i; + + token_i = 0; + while (tokens && tokens[token_i]) + token_i++; + while (0 < token_i) + free(tokens[--token_i]); + free(tokens); +} + +void free_cmd(t_cmd *cmd) +{ + size_t arg_i; + + arg_i = 0; + while (cmd->argv && cmd->argv[arg_i]) + free(cmd->argv[arg_i++]); + free(cmd->argv); + free(cmd); +} + +void free_cmds(t_cmd **cmds) +{ + size_t cmd_i; + + cmd_i = 0; + while (cmds[cmd_i]) + free_cmd(cmds[cmd_i++]); + free(cmds); +} diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c index 3a76ca3..49c4e7c 100644 --- a/src/parser/parser_utils.c +++ b/src/parser/parser_utils.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 13:40:56 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 16:48:32 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 21:26:41 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,24 +46,6 @@ size_t cmds_len(t_cmd **cmds) return (i); } -void free_cmds(t_cmd **cmds, size_t count) -{ - size_t cmd_i; - size_t arg_i; - - cmd_i = 0; - while (cmd_i < count) - { - arg_i = 0; - while (cmds[cmd_i]->argv && cmds[cmd_i]->argv[arg_i]) - free(cmds[cmd_i]->argv[arg_i++]); - free(cmds[cmd_i]->argv); - free(cmds[cmd_i]); - cmd_i++; - } - free(cmds); -} - int is_separator(char *token) { return (!ft_strcmp(token, "|") diff --git a/src/parser/setup_cmds.c b/src/parser/setup_cmds.c index b7d8003..c781b34 100644 --- a/src/parser/setup_cmds.c +++ b/src/parser/setup_cmds.c @@ -6,7 +6,7 @@ /* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 13:38:36 by ttsubo #+# #+# */ -/* Updated: 2025/05/02 18:59:44 by ttsubo ### ########.fr */ +/* Updated: 2025/05/02 21:26:54 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,7 +39,7 @@ t_cmd **setup_cmds(t_cmd **cmds, char **tokens) { cmds[cmd_i]->argv[arg_i] = ft_strdup(tokens[token_i]); if (!cmds[cmd_i]->argv[arg_i]) - return (free_cmds(cmds, cmd_i), NULL); + return (free_cmds(cmds), NULL); arg_i++; } token_i++;