/* 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
{
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);
/* 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 */
/* */
/* ************************************************************************** */
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)
int i;
i = 0;
+ if (assigns == 0)
+ return ;
while (assigns[i] != NULL)
{
free(assigns[i]->var);
- free(assigns[i]->value);
free(assigns[i]);
i++;
}
/* 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 */
/* */
/* ************************************************************************** */
node->content.cmd.assigns = assigns;
node->content.cmd.redirs[0] = redirs[0];
node->content.cmd.redirs[1] = redirs[1];
+ free(redirs);
return (node);
}
/* 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 */
/* */
/* ************************************************************************** */
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)
{
{
t_redirection *result;
t_token *cur;
+ int idx;
cur = *tokens;
result = malloc(sizeof(t_redirection) * 2);
// 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)
result[i] = NULL;
return (result);
}
+
+static void set_redir(t_redirection *redir, int type, char *specifier)
+{
+ redir->type = type;
+ redir->specifier = specifier;
+}