bquotes expand correctly but segfault afterwards...
This commit is contained in:
parent
742a99440e
commit
2e0b6102ce
10 changed files with 128 additions and 105 deletions
|
|
@ -137,6 +137,7 @@ job-control/sigtstp_handler.c\
|
|||
job-control/sigttin_handler.c\
|
||||
job-control/sigttou_handler.c\
|
||||
lexer/command_getoutput.c\
|
||||
lexer/expand_bquotes.c\
|
||||
lexer/get_state_global.c\
|
||||
lexer/get_state_redir.c\
|
||||
lexer/lexer_backslash.c\
|
||||
|
|
@ -157,12 +158,10 @@ lexer/lexer_paren.c\
|
|||
lexer/lexer_quote.c\
|
||||
lexer/lexer_sep.c\
|
||||
lexer/lexer_word.c\
|
||||
lexer/reduce_bquotes.c\
|
||||
lexer/reduce_parens.c\
|
||||
lexer/stack_to_prompt.c\
|
||||
lexer/token_append.c\
|
||||
lexer/token_cmp_type.c\
|
||||
lexer/token_expand_var.c\
|
||||
lexer/token_free.c\
|
||||
lexer/token_init.c\
|
||||
lexer/token_print.c\
|
||||
|
|
|
|||
|
|
@ -30,14 +30,12 @@
|
|||
# define TK_AMP (1 << 10)
|
||||
# define TK_PAREN_OPEN (1 << 11)
|
||||
# define TK_PAREN_CLOSE (1 << 12)
|
||||
# define TK_BQUOTE (1 << 13)
|
||||
# define TK_WORD (1 << 14)
|
||||
# define TK_COMMAND (1 << 17)
|
||||
# define TK_SUBSHELL (1 << 18)
|
||||
# define TK_NEWLINE (1 << 19)
|
||||
# define TK_WORD (1 << 13)
|
||||
# define TK_COMMAND (1 << 14)
|
||||
# define TK_SUBSHELL (1 << 15)
|
||||
# define TK_NEWLINE (1 << 16)
|
||||
|
||||
# define TK_REDIR (0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20)
|
||||
# define TK_NON_FREEABLE (TK_BQUOTE)
|
||||
|
||||
enum e_lexstate
|
||||
{
|
||||
|
|
@ -89,10 +87,9 @@ int token_append(t_token *token, t_lexer *lexer,
|
|||
void token_free(void *data, size_t size);
|
||||
int token_cmp_type(t_token *token, t_type *ref);
|
||||
void token_print(t_list *lst);
|
||||
void token_expand_var(t_token *token);
|
||||
|
||||
int reduce_parens(t_list **alst, char *str);
|
||||
int reduce_bquotes(t_list **alst, char **str);
|
||||
int expand_bquotes(t_list **alst);
|
||||
char *command_getoutput(char *command);
|
||||
|
||||
int ft_is_delim(char c);
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit acd7e54fb8045b3958dd239d469f1476404468b7
|
||||
Subproject commit d0ac53c68648106b8bafcc5ee8334306f6b0bc7e
|
||||
|
|
@ -34,7 +34,7 @@ char *command_getoutput(char *command)
|
|||
ast = btree_create_node(&item, sizeof(item));
|
||||
pipe(fds);
|
||||
exec->process.fdout = fds[PIPE_WRITE];
|
||||
ft_exec(&ast);
|
||||
exec_command(&ast);
|
||||
exec->process.fdout = STDOUT;
|
||||
close(fds[PIPE_WRITE]);
|
||||
while ((ret = read(fds[PIPE_READ], buf, BUF_SIZE)))
|
||||
|
|
|
|||
79
42sh/src/lexer/expand_bquotes.c
Normal file
79
42sh/src/lexer/expand_bquotes.c
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* expand_bquotes.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */
|
||||
/* Updated: 2017/02/09 20:45:08 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "lexer.h"
|
||||
|
||||
int expand_bquotes(t_list **alst)
|
||||
{
|
||||
t_list *new_word;
|
||||
t_list *after_word;
|
||||
t_list *cur_word;
|
||||
t_list *lst;
|
||||
t_token *token;
|
||||
t_token token_buf;
|
||||
char *word;
|
||||
char *output;
|
||||
char *bq_start;
|
||||
char *bq_end;
|
||||
char *after_bq;
|
||||
char **str;
|
||||
t_flag tk;
|
||||
|
||||
tk = TK_WORD;
|
||||
cur_word = *alst;
|
||||
while (cur_word && (lst = ft_lst_find(cur_word, &tk, token_cmp_type)))
|
||||
{
|
||||
cur_word = lst;
|
||||
after_word = cur_word->next;
|
||||
token = cur_word->content;
|
||||
str = &token->data;
|
||||
DG("found word=[%s]", *str);
|
||||
if (!(bq_start = ft_strchr(*str, '`')))
|
||||
{
|
||||
cur_word = cur_word->next;
|
||||
continue ;
|
||||
}
|
||||
if (!(bq_end = ft_strchr(bq_start + 1, '`')))
|
||||
{
|
||||
ft_dprintf(2, "{red}%s: parse error near '`'{eoc}\n", SHELL_NAME);
|
||||
return (-1);
|
||||
}
|
||||
*bq_end = 0;
|
||||
after_bq = ft_strdup(bq_end + 1);
|
||||
output = command_getoutput(bq_start + 1);
|
||||
word = ft_strtok(output, " \n\t");
|
||||
DG("strtok=[%s]", word);
|
||||
DG("first_tok was [%s]", *str);
|
||||
*bq_start = 0;
|
||||
ft_strappend(str, word);
|
||||
DG("first_tok=[%s]", *str);
|
||||
while ((word = ft_strtok(NULL, " \n\t")))
|
||||
{
|
||||
DG("strtok=[%s]", word);
|
||||
token_buf.data = ft_strdup(word);
|
||||
token_buf.type = TK_WORD;
|
||||
new_word = ft_lstnew(&token_buf, sizeof(token_buf));
|
||||
cur_word->next = new_word;
|
||||
new_word->next = after_word;
|
||||
cur_word = new_word;
|
||||
}
|
||||
token = new_word->content;
|
||||
ft_strappend(&token->data, after_bq);
|
||||
ft_strdel(&after_bq);
|
||||
ft_strdel(&output);
|
||||
cur_word = after_word;
|
||||
}
|
||||
token_print(*alst);
|
||||
DG("check end");
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* reduce_bquotes.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/01/11 16:46:27 by jhalford #+# #+# */
|
||||
/* Updated: 2017/02/09 20:45:08 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "lexer.h"
|
||||
|
||||
int reduce_bquotes(t_list **alst, char **str)
|
||||
{
|
||||
t_list *start;
|
||||
t_list **end;
|
||||
t_token *token;
|
||||
int tk;
|
||||
char *new;
|
||||
char *fit;
|
||||
char *bq_start;
|
||||
char *bq_end;
|
||||
t_lexer lexer;
|
||||
|
||||
tk = TK_BQUOTE;
|
||||
if ((start = ft_lst_find(*alst, &tk, token_cmp_type)))
|
||||
{
|
||||
end = &start->next;
|
||||
while (end && *end)
|
||||
{
|
||||
token = (*end)->content;
|
||||
if (token->type == TK_BQUOTE)
|
||||
break ;
|
||||
end = &(*end)->next;
|
||||
}
|
||||
if (!*end)
|
||||
return (-1);
|
||||
bq_start = ((t_token*)start->content)->data;
|
||||
bq_end = ((t_token*)(*end)->content)->data;
|
||||
ft_lstdel(end, token_free);
|
||||
fit = command_getoutput(ft_strbetween(bq_start + 1, bq_end));
|
||||
new = ft_strreplace(str, bq_start, bq_end, fit);
|
||||
ft_strdel(str);
|
||||
*str = new;
|
||||
ft_lstdel(alst, token_free);
|
||||
|
||||
lexer.pos = 0;
|
||||
lexer.str = *str;
|
||||
lexer.state = DEFAULT;
|
||||
lexer_lex(alst, &lexer);
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* token_expand_var.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/01/10 14:57:53 by jhalford #+# #+# */
|
||||
/* Updated: 2017/02/07 13:16:04 by wescande ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "lexer.h"
|
||||
/*
|
||||
void token_expand_var(t_token *token)
|
||||
{
|
||||
char *dollar;
|
||||
char *val;
|
||||
|
||||
dollar = ft_strchr(token->data, '$');
|
||||
if (!dollar[1])
|
||||
return ;
|
||||
val = ft_getenv(data_singleton()->env, dollar + 1);
|
||||
*dollar = 0;
|
||||
if (val)
|
||||
while (*val)
|
||||
token_append(token, *val++, 1, 1);
|
||||
}
|
||||
*/
|
||||
|
|
@ -18,11 +18,8 @@ void token_free(void *data, size_t size)
|
|||
|
||||
(void)size;
|
||||
token = data;
|
||||
if (!(token->type & TK_NON_FREEABLE))
|
||||
{
|
||||
ft_strdel(&token->data);
|
||||
ft_memdel((void **)&token->esc);
|
||||
ft_memdel((void **)&token->esc2);
|
||||
}
|
||||
free(token);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,35 @@
|
|||
|
||||
#include "minishell.h"
|
||||
|
||||
int non_interactive_shell(char *command)
|
||||
{
|
||||
t_list *token;
|
||||
t_lexer lexer;
|
||||
t_btree *ast;
|
||||
|
||||
lexer.pos = 0;
|
||||
lexer.state = DEFAULT;
|
||||
lexer.str = command;
|
||||
lexer.stack = NULL;
|
||||
token = NULL;
|
||||
ast = NULL;
|
||||
while (lexer.str[lexer.pos])
|
||||
{
|
||||
if (lexer.stack && *(int*)lexer.stack->content == BACKSLASH)
|
||||
pop(&lexer.stack);
|
||||
do {
|
||||
lexer_lex(&token, &lexer);
|
||||
} while (lexer.str[lexer.pos] == '\n');
|
||||
if (expand_bquotes(&token))
|
||||
return (1);
|
||||
token_print(token);
|
||||
if (ft_parse(&ast, &token))
|
||||
return (1);
|
||||
if (ft_exec(&ast))
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
int interactive_shell()
|
||||
{
|
||||
t_list *token;
|
||||
|
|
@ -34,6 +63,11 @@ int interactive_shell()
|
|||
DG("[{mag}%s{eoc}] stack=[%i] state=[%i]", lexer.str, lexer.stack ? *(int*)lexer.stack->content : 0, lexer.state);
|
||||
token_print(token);
|
||||
} while (lexer.stack);
|
||||
if (expand_bquotes(&token))
|
||||
return (1);
|
||||
DG("check main 0");
|
||||
token_print(token);
|
||||
DG("check main 1");
|
||||
if (ft_parse(&ast, &token))
|
||||
return (1);
|
||||
btree_print(STDBUG, ast, &ft_putast);
|
||||
|
|
@ -55,5 +89,7 @@ int main(int ac, char **av)
|
|||
while (1)
|
||||
interactive_shell();
|
||||
}
|
||||
else
|
||||
non_interactive_shell(shell_get_avdata());
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ void shell_exit(void)
|
|||
{
|
||||
DG("shell_exit()");
|
||||
data_exit();
|
||||
if (SH_HAS_JOBC(data_singleton()->opts))
|
||||
job_kill_all();
|
||||
tcsetattr(STDIN, TCSANOW, &data_singleton()->jobc.shell_tmodes);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue