Browse Source

parser norminage

master
narnaud 3 years ago
parent
commit
8129d31bc8
  1. 4
      minishell.h
  2. 54
      parser.c
  3. 20
      utils_2.c

4
minishell.h

@ -35,6 +35,7 @@
typedef struct s_command
{
char **argv;
int argc;
int fd[2];
char *heredoc;
struct s_command *next;
@ -58,6 +59,8 @@ void halt(int ret_code);
int replace_var(t_datas *datas, char **line, \
char *tmp, int tmp_i);
int file_error(char *cmd, char *file, char *msg);
char *expend_str(t_datas *datas, char *line);
// ----------------------------------Builtins.c
int close_minishell(int exit_code);
int ft_echo(t_command *cmd);
@ -95,7 +98,6 @@ typedef struct s_token
struct s_token *next;
} t_token;
char *expend_str(t_datas *datas, char *line);
size_t count_arguments(t_token *tok);
void update_redir(t_datas *datas, t_command *cmd,\
t_token *tok);

54
parser.c

@ -12,26 +12,6 @@
#include "minishell.h"
char *expend_str(t_datas *datas, char *line)
{
char *tmp;
int tmp_i;
tmp = ft_calloc(1024, sizeof *tmp);
if (!tmp)
free(tmp);
tmp_i = 0;
while (*line)
{
if (*line == '$')
tmp_i = replace_var(datas, &line, tmp, tmp_i);
tmp[tmp_i] = *line;
line++;
tmp_i++;
}
return (tmp);
}
int push_heredoc(t_datas *datas, char *str)
{
char *line;
@ -92,34 +72,34 @@ void update_redir(t_datas *datas, t_command *cmd, t_token *tok)
}
}
t_command *parser(t_datas *datas, t_token *tok, t_command *prev)
t_token *parse_cmd(t_datas *datas, t_token *tok, t_command *cmd)
{
int i;
t_command *cmd;
t_token *prev_tok;
if (!tok)
return (NULL);
cmd = ft_calloc(1, sizeof(t_command));
if (prev)
cmd->prev = prev;
i = 0;
cmd->argv = ft_calloc(count_arguments(tok) + 1, sizeof(char *));
while(tok && tok->type != PIPE)
{
if (tok->type)
update_redir(datas, cmd, tok);
else
cmd->argv[i++] = ft_strdup(tok->value);
cmd->argv[cmd->argc++] = ft_strdup(tok->value);
prev_tok = tok;
tok = tok->next;
free(prev_tok->value);
free(prev_tok);
return (tok);
}
if (DEBUG)
printf("######\n->cmd : %s, in_fd : %d, out_fd : %d\n", \
cmd->argv[0], cmd->fd[0], cmd->fd[1]);
cmd->argv[i] = NULL;
t_command *parser(t_datas *datas, t_token *tok, t_command *prev)
{
t_command *cmd;
if (!tok)
return (NULL);
cmd = ft_calloc(1, sizeof(t_command));
if (prev)
cmd->prev = prev;
cmd->argv = ft_calloc(count_arguments(tok) + 1, sizeof(char *));
cmd->argc = 0;
while(tok && tok->type != PIPE)
tok = parse_cmd(datas, tok, cmd);
cmd->argv[cmd->argc] = NULL;
if (tok && tok->type == PIPE)
{
cmd->next = parser(datas, tok->next, cmd);

20
utils_2.c

@ -74,3 +74,23 @@ int replace_var(t_datas *datas, char **line, char *tmp, int tmp_i)
free(value);
return (tmp_i);
}
char *expend_str(t_datas *datas, char *line)
{
char *tmp;
int tmp_i;
tmp = ft_calloc(1024, sizeof *tmp);
if (!tmp)
free(tmp);
tmp_i = 0;
while (*line)
{
if (*line == '$')
tmp_i = replace_var(datas, &line, tmp, tmp_i);
tmp[tmp_i] = *line;
line++;
tmp_i++;
}
return (tmp);
}

Loading…
Cancel
Save