From: Lukas Jiriste Date: Mon, 22 Jul 2024 20:30:40 +0000 (+0200) Subject: Add var expansion and quote handling to assignment X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=ba949613c43d490d22f76e95cdcfad6cf5d5cec9;p=42%2Fminishell.git Add var expansion and quote handling to assignment It is a little ugly because I adapted the machinery that handles the expansion and quote handling of fields. This may be rectified in future refactor. --- diff --git a/src/execution.c b/src/execution.c index 8e1200c..fa928b7 100644 --- a/src/execution.c +++ b/src/execution.c @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/21 08:57:54 by ljiriste #+# #+# */ -/* Updated: 2024/07/22 22:11:44 by ljiriste ### ########.fr */ +/* Updated: 2024/07/22 22:29:04 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -52,20 +52,29 @@ void clear_old(t_vec *assignments, const char *new) return ; } -int add_assignment(t_vec *assignments, const char *assignment) +int add_word(t_vec *exp_str, const char *word, const t_execution_env *env); + +void unquote_field(char *field); + +int add_assignment(t_vec *assignments, const char *assignment, const t_execution_env *env) { + t_vec advanced_copy; char *copy; - copy = ft_strdup(assignment); - if (!copy) + if (ft_vec_init(&advanced_copy, sizeof(char)) != success) + return (1); + if (add_word(&advanced_copy, assignment, env)) return (1); + copy = advanced_copy.vec; + unquote_field(copy); clear_old(assignments, copy); if (ft_vec_append(assignments, ©) == success) return (0); + free(copy); return (1); } -int save_assignments_prefix(t_vec *assignments, t_parse_tree_node *prefix) +int save_assignments_prefix(t_vec *assignments, t_parse_tree_node *prefix, const t_execution_env *env) { size_t i; t_parse_tree_node *subnode; @@ -76,18 +85,18 @@ int save_assignments_prefix(t_vec *assignments, t_parse_tree_node *prefix) subnode = ft_vec_access(&prefix->children, i); if (is_token_type(subnode, "ASSIGNMENT_WORD")) { - if (add_assignment(assignments, subnode->token.str)) + if (add_assignment(assignments, subnode->token.str, env)) return (1); } else if (is_token_type(subnode, "cmd_prefix")) - if (save_assignments_prefix(assignments, subnode)) + if (save_assignments_prefix(assignments, subnode, env)) return (1); ++i; } return (0); } -int save_assignments(t_vec *assignments, t_parse_tree_node *simple_command) +int save_assignments(t_vec *assignments, t_parse_tree_node *simple_command, const t_execution_env *env) { t_parse_tree_node *subnode; @@ -95,7 +104,7 @@ int save_assignments(t_vec *assignments, t_parse_tree_node *simple_command) return (1); subnode = ft_vec_access(&simple_command->children, 0); if (is_token_type(subnode, "cmd_prefix")) - return (save_assignments_prefix(assignments, subnode)); + return (save_assignments_prefix(assignments, subnode, env)); return (0); } @@ -598,7 +607,7 @@ int ex_simple_command(t_parse_tree_node *simple_command, t_execution_env *env) int res; res = save_redirections(&redirections, simple_command, env); - res = res || save_assignments(&assignments, simple_command); + res = res || save_assignments(&assignments, simple_command, env); if (!res) fields = expand(simple_command, env); if (!fields || res)