From 185a0690444024979671f1366c094e41b38929a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Thu, 20 Mar 2025 12:17:54 +0100 Subject: [PATCH] cmdgroup parsing refactor: use builder pattern This will make it easier to add the next logic stuff to it --- Makefile | 1 + src/parser/cmdgroup/cmdgroup.c | 23 +++++++---- src/parser/cmdgroup/cmdgroup_builder.c | 53 ++++++++++++++++++++++++++ src/parser/cmdgroup/cmdgroup_builder.h | 46 ++++++++++++++++++++++ 4 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/parser/cmdgroup/cmdgroup_builder.c create mode 100644 src/parser/cmdgroup/cmdgroup_builder.h diff --git a/Makefile b/Makefile index bafae2c..501c262 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,7 @@ srcs = \ src/executing/here_doc/strip_newline.c \ src/ft_errno.c \ src/get_command.c \ + src/parser/cmdgroup/cmdgroup_builder.c \ src/parser/cmdgroup/cmdgroup.c \ src/parser/cmdlist/cmdlist.c \ src/parser/cmdlist/cmdlist_builder.c \ diff --git a/src/parser/cmdgroup/cmdgroup.c b/src/parser/cmdgroup/cmdgroup.c index e70370b..d02412c 100644 --- a/src/parser/cmdgroup/cmdgroup.c +++ b/src/parser/cmdgroup/cmdgroup.c @@ -6,28 +6,37 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/11 15:18:02 by khais #+# #+# */ -/* Updated: 2025/03/19 12:10:19 by khais ### ########.fr */ +/* Updated: 2025/03/20 12:27:57 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "cmdgroup.h" +#include "cmdgroup_builder.h" #include #include "libft.h" #include "../../treedrawing.h" #include "../../postprocess/redirections/redirection_list.h" #include "libft/libft.h" -t_cmdgroup *cmdgroup_from_wordlist(t_wordlist *words) +t_cmdgroup *cmdgroup_from_wordlist(t_wordlist *wordlist) { - t_cmdgroup *cmd; + t_cmdgroup_builder builder; + t_wordlist *words; + words = wordlist_copy(wordlist); if (words == NULL) return (NULL); - cmd = ft_calloc(1, sizeof(t_cmdgroup)); - if (cmd == NULL) + if (setup_cmdgroup_builder(&builder, &words) == NULL) + return (wordlist_destroy(words), NULL); + while (builder.error == false && builder.current_word != NULL) + { + cmdgroup_builder_next_word(&builder, &words); + } + if (builder.current_wordlist != NULL) + cmdgroup_builder_delimit(&builder, &words); + if (builder.error == true) return (NULL); - cmd->item = cmdlist_from_wordlist(words); - return (cmd); + return (builder.cmdgroup); } void cmdgroup_destroy(t_cmdgroup *cmd) diff --git a/src/parser/cmdgroup/cmdgroup_builder.c b/src/parser/cmdgroup/cmdgroup_builder.c new file mode 100644 index 0000000..46c8394 --- /dev/null +++ b/src/parser/cmdgroup/cmdgroup_builder.c @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cmdgroup_builder.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: khais +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/03/20 12:32:14 by khais #+# #+# */ +/* Updated: 2025/03/20 12:49:37 by khais ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "cmdgroup_builder.h" +#include "libft.h" + +/* +** setup a cmdlist_builder by allocating additionall needed memory and +** performing other init steps. +*/ +t_cmdgroup_builder *setup_cmdgroup_builder(t_cmdgroup_builder *builder, + t_wordlist **words) +{ + ft_bzero(builder, sizeof (*builder)); + builder->cmdgroup = ft_calloc(1, sizeof(*builder->cmdgroup)); + if (builder->cmdgroup == NULL) + return (NULL); + builder->current_wordlist = NULL; + builder->current_word = wordlist_pop(words); + return (builder); +} + +/* +** Advance the state to the next word +*/ +void cmdgroup_builder_next_word(t_cmdgroup_builder *builder, + t_wordlist **words) +{ + builder->current_wordlist = wordlist_push(builder->current_wordlist, + builder->current_word); + builder->current_word = wordlist_pop(words); +} + +/* +** Delimit the cmdlist, setting up the t_cmdlist item. +*/ +void cmdgroup_builder_delimit(t_cmdgroup_builder *builder, + t_wordlist **words) +{ + builder->cmdgroup->item = cmdlist_from_wordlist(builder->current_wordlist); + wordlist_destroy(builder->current_wordlist); + builder->current_wordlist = NULL; + (void)words; +} diff --git a/src/parser/cmdgroup/cmdgroup_builder.h b/src/parser/cmdgroup/cmdgroup_builder.h new file mode 100644 index 0000000..8ff0676 --- /dev/null +++ b/src/parser/cmdgroup/cmdgroup_builder.h @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cmdgroup_builder.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: khais +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/03/20 12:27:20 by khais #+# #+# */ +/* Updated: 2025/03/20 12:50:09 by khais ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef CMDGROUP_BUILDER_H +# define CMDGROUP_BUILDER_H + +# include "../wordlist/wordlist.h" +# include "cmdgroup.h" + +typedef struct s_cmdgroup_builder +{ + /* + ** set to true if in an error state + */ + bool error; + /* + ** current word that is being examined + */ + t_worddesc *current_word; + /* + ** wordlist to be passed to lower stages of parsing + */ + t_wordlist *current_wordlist; + /* + ** cmdgroup that is being constructed + */ + t_cmdgroup *cmdgroup; +} t_cmdgroup_builder; + +t_cmdgroup_builder *setup_cmdgroup_builder(t_cmdgroup_builder *builder, + t_wordlist **words); +void cmdgroup_builder_next_word(t_cmdgroup_builder *builder, + t_wordlist **words); +void cmdgroup_builder_delimit(t_cmdgroup_builder *builder, + t_wordlist **words); + +#endif // CMDGROUP_BUILDER_H