Add var expansion and quote handling to assignment
authorLukas Jiriste <ljiriste@student.42prague.com>
Mon, 22 Jul 2024 20:30:40 +0000 (22:30 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Mon, 22 Jul 2024 20:30:40 +0000 (22:30 +0200)
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.

src/execution.c

index 8e1200c078a3ba5527bbf45f76ba3ea04a6bb799..fa928b7c789591b98b7d153aa0ab46cd66c90b58 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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, &copy) == 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)