]> git.dkaiser.de - 42/minishell.git/commitdiff
Fix errors and make the parser work
authorDominik Kaiser <dkaiser@1-E-17.42heilbronn.de>
Mon, 22 Jul 2024 13:07:59 +0000 (15:07 +0200)
committerDominik Kaiser <dkaiser@1-E-17.42heilbronn.de>
Mon, 22 Jul 2024 13:07:59 +0000 (15:07 +0200)
include/ast.h
src/free_node.c
src/new_node.c
src/parse_cmd.c

index b0ed996d2a45df0dd094c6fb7135f6198ac8a408..bf190838ddeb40b66c8eae801dfae59a4e66be4e 100644 (file)
@@ -6,12 +6,12 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/27 11:48:27 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/07/09 16:54:29 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/07/10 12:31:39 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
-#include "stdlib.h"
 #include "debug_tools.h"
+#include "stdlib.h"
 
 enum                                           e_node_type
 {
@@ -68,5 +68,8 @@ typedef struct s_node
 
 t_node                                         *new_node(int type);
 t_node                                         *new_pipe_node(t_node *left, t_node *right);
-t_node                                         *new_cmd_node(char **args, t_assign  **assigns, t_redirection redirs[2]);
+t_node                                         *new_cmd_node(char **args, t_assign **assigns,
+                                                               t_redirection redirs[2]);
 t_node                                         *new_string_node(char *string);
+
+void                                           free_node(t_node *node);
index 2dfeb7d7f1f2a2a94ffd664ae68ed0820616dece..f8677d516039a5379a24342b801923158e2eb38d 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/27 11:41:46 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/07/09 11:37:11 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/07/22 14:30:14 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -40,15 +40,17 @@ static void free_cmd_node(t_node *node)
        int     i;
 
        i = 0;
-       while (node->content.cmd.args[i] != NULL)
+       while (node->content.cmd.args != NULL && node->content.cmd.args[i] != NULL)
        {
                free(node->content.cmd.args[i]);
                i++;
        }
        free(node->content.cmd.args);
        free_assigns(node->content.cmd.assigns);
-       free(node->content.cmd.redirs[0].specifier);
-       free(node->content.cmd.redirs[1].specifier);
+       if (node->content.cmd.redirs[0].type != 0 && node->content.cmd.redirs[0].specifier != NULL)
+               free(node->content.cmd.redirs[0].specifier);
+       if (node->content.cmd.redirs[1].type != 0 && node->content.cmd.redirs[0].specifier != NULL)
+               free(node->content.cmd.redirs[1].specifier);
 }
 
 static void    free_assigns(t_assign **assigns)
@@ -56,10 +58,11 @@ static void free_assigns(t_assign **assigns)
        int     i;
 
        i = 0;
+       if (assigns == 0)
+               return ;
        while (assigns[i] != NULL)
        {
                free(assigns[i]->var);
-               free(assigns[i]->value);
                free(assigns[i]);
                i++;
        }
index c334eb6cd4803a63b9d850b0012c5027c240f39b..c2458d0430669e12283c7e30e07dd4fa5cecf640 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/27 11:21:03 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/07/08 16:10:44 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/07/22 14:25:03 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -46,6 +46,7 @@ t_node        *new_cmd_node(char **args, t_assign **assigns, t_redirection redirs[2])
        node->content.cmd.assigns = assigns;
        node->content.cmd.redirs[0] = redirs[0];
        node->content.cmd.redirs[1] = redirs[1];
+       free(redirs);
        return (node);
 }
 
index 4fa2bc2defc0f44f02076e137dc833ca798f6353..0173caae106a426032180e63e90319c6a8d671a6 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/07/08 15:06:25 by dkaiser           #+#    #+#             */
-/*   Updated: 2024/07/09 19:22:51 by dkaiser          ###   ########.fr       */
+/*   Updated: 2024/07/10 13:26:17 by dkaiser          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -16,6 +16,8 @@ static t_redirection  *collect_redirs(t_token **tokens);
 static t_assign                        **collect_assigns(t_token **tokens);
 static char                            **collect_args(t_token **tokens);
 static t_assign                        *to_assign(char *str);
+static void                            set_redir(t_redirection *redir, int type,
+                                                       char *specifier);
 
 t_node *parse_cmd(t_token *tokens)
 {
@@ -33,6 +35,7 @@ static t_redirection  *collect_redirs(t_token **tokens)
 {
        t_redirection   *result;
        t_token                 *cur;
+       int                             idx;
 
        cur = *tokens;
        result = malloc(sizeof(t_redirection) * 2);
@@ -41,24 +44,18 @@ static t_redirection        *collect_redirs(t_token **tokens)
                // free all tokens
                return (NULL);
        }
-       result[0].specifier = NULL;
-       result[0].type = 0;
-       result[1].specifier = NULL;
-       result[1].type = 0;
+       set_redir(&result[0], 0, NULL);
+       set_redir(&result[1], 0, NULL);
        while (cur != NULL && cur->next != NULL)
        {
                if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN)
                {
                        if (cur->content.redir_type & (INPUT_FILE | INPUT_LIMITER))
-                       {
-                               result[0].type = cur->content.redir_type;
-                               result[0].specifier = cur->next->content.string;
-                       }
+                               idx = 0;
                        else if (cur->content.redir_type & (OUTPUT_APPEND | OUTPUT_OVERRIDE))
-                       {
-                               result[1].type = cur->content.redir_type;
-                               result[1].specifier = cur->next->content.string;
-                       }
+                               idx = 1;
+                       set_redir(&result[idx], cur->content.redir_type,
+                               cur->next->content.string);
                        cur = cur->next;
                        free_token_and_connect(cur->previous);
                        if (cur->next != NULL)
@@ -170,3 +167,9 @@ static char **collect_args(t_token **tokens)
        result[i] = NULL;
        return (result);
 }
+
+static void    set_redir(t_redirection *redir, int type, char *specifier)
+{
+       redir->type = type;
+       redir->specifier = specifier;
+}