Merge branch 'pda' of https://github.com/jzck/42sh into pda
"recup work last night"
This commit is contained in:
commit
65930ddf07
17 changed files with 78 additions and 43 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
case $rental in
|
case van in
|
||||||
( "bus" ) echo Hello world ;;
|
( "bus" ) echo Hello world ;;
|
||||||
( "van" ) echo Comment va ? ;;
|
( "velo" ) echo Comment va ;;
|
||||||
|
( "van" ) ls ;;
|
||||||
esac
|
esac
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,8 @@
|
||||||
for i in hello bonjour salut comment
|
for i in hello bonjour salut comment
|
||||||
do
|
do
|
||||||
ls
|
while cat efezf
|
||||||
|
do
|
||||||
|
echo INSIDE
|
||||||
|
done
|
||||||
|
ls | cat
|
||||||
done
|
done
|
||||||
|
|
|
||||||
|
|
@ -14,19 +14,17 @@
|
||||||
|
|
||||||
int exec_case(t_btree **ast)
|
int exec_case(t_btree **ast)
|
||||||
{
|
{
|
||||||
// t_astnode *node;
|
t_astnode *node;
|
||||||
/* char **av; */
|
char *av;
|
||||||
t_exec *exec;
|
t_exec *exec;
|
||||||
|
|
||||||
(void)ast;
|
(void)ast;
|
||||||
return (0);
|
|
||||||
exec = &data_singleton()->exec;
|
exec = &data_singleton()->exec;
|
||||||
/* data_singleton()->exec.process.case_branch = 0; */
|
exec->attrs &= ~EXEC_CASE_BRANCH;
|
||||||
exec->attrs |= EXEC_CASE_BRANCH;
|
|
||||||
|
|
||||||
// node = (*ast)->item;
|
node = (*ast)->item;
|
||||||
/* av = token_to_argv(node); */
|
av = node->data.str;
|
||||||
/* data_singleton()->exec.process.case_pattern = av[0]; */
|
// av = token_to_argv(node);
|
||||||
/* exec->case_pattern = av[0]; */
|
exec->case_pattern = av;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,22 +14,24 @@
|
||||||
|
|
||||||
int exec_case_branch(t_btree **ast)
|
int exec_case_branch(t_btree **ast)
|
||||||
{
|
{
|
||||||
// t_astnode *node;
|
t_astnode *node;
|
||||||
/* char **av; */
|
char *av;
|
||||||
t_exec *exec;
|
t_exec *exec;
|
||||||
|
|
||||||
(void)ast;
|
(void)ast;
|
||||||
return (0);
|
|
||||||
exec = &data_singleton()->exec;
|
exec = &data_singleton()->exec;
|
||||||
/* if (data_singleton()->exec.process.case_branch == 1) */
|
|
||||||
|
DG("case");
|
||||||
if (EXEC_IS_CASE_BRANCH(exec->attrs))
|
if (EXEC_IS_CASE_BRANCH(exec->attrs))
|
||||||
return (0);
|
return (0);
|
||||||
// node = (*ast)->item;
|
DG("case2");
|
||||||
/* av = token_to_argv(node); */
|
node = (*ast)->item;
|
||||||
/* if (ft_strcmp(av[0], data_singleton()->exec.process.case_pattern) == 1) */
|
av = node->data.str;
|
||||||
/* { */
|
// av = token_to_argv(node);
|
||||||
/* data_singleton()->exec.process.case_branch = 1; */
|
if (ft_strcmp(av, exec->case_pattern) == 0)
|
||||||
/* ft_exec(&(*ast)->right); */
|
{
|
||||||
/* } */
|
exec->attrs |= EXEC_CASE_BRANCH;
|
||||||
|
ft_exec(&(*ast)->right);
|
||||||
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,11 +22,12 @@ int exec_for(t_btree **ast)
|
||||||
node = (*ast)->item;
|
node = (*ast)->item;
|
||||||
temp = node->data.cmd.wordlist;
|
temp = node->data.cmd.wordlist;
|
||||||
var = temp->content;
|
var = temp->content;
|
||||||
builtin_setenv("setenv", (char*[]){var, 0}, data_singleton()->local_var);
|
temp = temp->next;
|
||||||
|
// declare error bad identifier
|
||||||
while (temp)
|
while (temp)
|
||||||
{
|
{
|
||||||
//process expansion av = token_to_char(temp->content)
|
builtin_setenv("setenv", (char*[]){var, temp->content, 0},
|
||||||
builtin_setenv("setenv", (char*[]){var, 0}, data_singleton()->local_var);
|
data_singleton()->local_var);
|
||||||
ft_exec(&(*ast)->right);
|
ft_exec(&(*ast)->right);
|
||||||
temp = temp->next;
|
temp = temp->next;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,9 @@ t_execmap g_execmap[] =
|
||||||
{TK_ELIF, &exec_elif},
|
{TK_ELIF, &exec_elif},
|
||||||
{TK_ELSE, &exec_else},
|
{TK_ELSE, &exec_else},
|
||||||
{TK_UNTIL, &exec_until},
|
{TK_UNTIL, &exec_until},
|
||||||
|
{TK_FOR, &exec_for},
|
||||||
|
{TK_CASE, &exec_case},
|
||||||
|
{TK_PAREN_OPEN, &exec_case_branch},
|
||||||
/* {TK_SUBSHELL, &exec_}, */
|
/* {TK_SUBSHELL, &exec_}, */
|
||||||
{CMD, &exec_cmd},
|
{CMD, &exec_cmd},
|
||||||
{0, 0},
|
{0, 0},
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ t_lexstate get_state_global(t_lexer *lexer)
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
c = lexer->str[lexer->pos];
|
c = lexer->str[lexer->pos];
|
||||||
DG("check, c=%c", lexer->str[lexer->pos]);
|
|
||||||
if (ft_is_delim(c))
|
if (ft_is_delim(c))
|
||||||
return (DELIM);
|
return (DELIM);
|
||||||
else if (c == '&' || c == ';' || c == '|')
|
else if (c == '&' || c == ';' || c == '|')
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ char *ft_putast(void *nodein)
|
||||||
t_astnode *node;
|
t_astnode *node;
|
||||||
node = nodein;
|
node = nodein;
|
||||||
|
|
||||||
|
if (node->type == TK_DSEMI)
|
||||||
|
return ("TK_DSEMI");
|
||||||
if (node->type == WORDLIST)
|
if (node->type == WORDLIST)
|
||||||
return ("WORDLIST");
|
return ("WORDLIST");
|
||||||
if (node->type == CMD)
|
if (node->type == CMD)
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ int handle_instruction(int fd)
|
||||||
error_syntax(&token, &parser, &ast);
|
error_syntax(&token, &parser, &ast);
|
||||||
}
|
}
|
||||||
DG("Before execution:");
|
DG("Before execution:");
|
||||||
btree_print(STDBUG, ast, &ft_putast);
|
// btree_print(STDBUG, ast, &ft_putast);
|
||||||
if (ft_exec(&ast))
|
if (ft_exec(&ast))
|
||||||
return (1);
|
return (1);
|
||||||
instruction_free(&token, &parser, &ast);
|
instruction_free(&token, &parser, &ast);
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ int iscase_pattern(t_btree **ast, t_list **lst)
|
||||||
t_astnode *node;
|
t_astnode *node;
|
||||||
t_token *token;
|
t_token *token;
|
||||||
|
|
||||||
|
DG(" add pattern");
|
||||||
node = NULL;
|
node = NULL;
|
||||||
token = (*lst)->content;
|
token = (*lst)->content;
|
||||||
if (*ast)
|
if (*ast)
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,8 @@ int superflous_token(t_btree **ast, t_list **lst)
|
||||||
if (*lst)
|
if (*lst)
|
||||||
{
|
{
|
||||||
token = (*lst)->content;
|
token = (*lst)->content;
|
||||||
if (token->type == TK_IN || token->type == TK_PAREN_OPEN)
|
if (token->type == TK_IN || token->type == TK_PAREN_CLOSE
|
||||||
|
|| token->type == TK_DSEMI)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
|
|
@ -54,7 +55,7 @@ static int no_del_token(t_btree **ast, t_list **lst)
|
||||||
if (*ast)
|
if (*ast)
|
||||||
{
|
{
|
||||||
node = (*ast)->item;
|
node = (*ast)->item;
|
||||||
if (node->type != TK_DO && node->type != TK_THEN && node->type != TK_PAREN_CLOSE
|
if (node->type != TK_DO && node->type != TK_THEN
|
||||||
&& node->type != CMD && node->type != REDIR)
|
&& node->type != CMD && node->type != REDIR)
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
@ -91,6 +92,7 @@ int add_cmd(t_btree **ast, t_list **lst)
|
||||||
node->type = CMD;
|
node->type = CMD;
|
||||||
if (token->type == TK_WORD || token->type == TK_ASSIGNEMENT_WORD)
|
if (token->type == TK_WORD || token->type == TK_ASSIGNEMENT_WORD)
|
||||||
{
|
{
|
||||||
|
DG("add cmd default");
|
||||||
if ((my_tab = (char **)malloc(sizeof(char *) * 4)))
|
if ((my_tab = (char **)malloc(sizeof(char *) * 4)))
|
||||||
{
|
{
|
||||||
my_tab[0] = ft_strdup(token->data);
|
my_tab[0] = ft_strdup(token->data);
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ int iscondition(t_btree **ast, t_list **lst)
|
||||||
|
|
||||||
node = NULL;
|
node = NULL;
|
||||||
// token = (*lst)->content;
|
// token = (*lst)->content;
|
||||||
DG("iscondition");
|
|
||||||
if (*ast)
|
if (*ast)
|
||||||
{
|
{
|
||||||
node = (*ast)->item;
|
node = (*ast)->item;
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,20 @@
|
||||||
int isionumber(t_btree **ast, t_list **lst)
|
int isionumber(t_btree **ast, t_list **lst)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
|
t_astnode *node;
|
||||||
|
|
||||||
(void)ast;
|
|
||||||
token = (*lst)->content;
|
token = (*lst)->content;
|
||||||
if (token->type == TK_IO_NUMBER)
|
if (*ast)
|
||||||
return (1);
|
{
|
||||||
|
node = (*ast)->item;
|
||||||
|
if (node->type == CMD && token->type == TK_IO_NUMBER)
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (!*ast)
|
||||||
|
{
|
||||||
|
if (token->type == TK_IO_NUMBER)
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,13 +15,25 @@
|
||||||
int isdir_sep(t_btree **ast, t_list **list)
|
int isdir_sep(t_btree **ast, t_list **list)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
|
t_astnode *node;
|
||||||
|
|
||||||
(void)ast;
|
|
||||||
token = (*list)->content;
|
token = (*list)->content;
|
||||||
if (token->type == TK_LESS || token->type == TK_GREAT
|
if (*ast)
|
||||||
|| token->type == TK_GREATAND || token->type == TK_LESSAND
|
{
|
||||||
|| token->type == TK_DLESS || token->type == TK_DGREAT)
|
node = (*ast)->item;
|
||||||
|
if ((node->type == CMD || node->type == TK_IO_NUMBER) &&
|
||||||
|
(token->type == TK_LESS || token->type == TK_GREAT
|
||||||
|
|| token->type == TK_GREATAND || token->type == TK_LESSAND
|
||||||
|
|| token->type == TK_DLESS || token->type == TK_DGREAT))
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (!*ast)
|
||||||
|
{
|
||||||
|
if (token->type == TK_LESS || token->type == TK_GREAT
|
||||||
|
|| token->type == TK_GREATAND || token->type == TK_LESSAND
|
||||||
|
|| token->type == TK_DLESS || token->type == TK_DGREAT)
|
||||||
return (1);
|
return (1);
|
||||||
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ t_aggrematch g_aggrematch[] =
|
||||||
{TK_WORD, TK_IN, FOR_WORDLIST, TK_IN},
|
{TK_WORD, TK_IN, FOR_WORDLIST, TK_IN},
|
||||||
{TK_WORD, FOR_WORDLIST, FOR_WORDLIST, FOR_WORDLIST},
|
{TK_WORD, FOR_WORDLIST, FOR_WORDLIST, FOR_WORDLIST},
|
||||||
{TK_SEMI, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
|
{TK_SEMI, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
|
||||||
|
{TK_DSEMI, CMD_SUPERIOR, PIPE_SEQUENCE, CMD_SUPERIOR},
|
||||||
{TK_DSEMI, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE},
|
{TK_DSEMI, PIPE_SEMI_SEQUENCE, PIPE_SEQUENCE, PIPE_SEMI_SEQUENCE},
|
||||||
{TK_PAREN_OPEN, TK_IN, PATTERN_CASE, 0},
|
{TK_PAREN_OPEN, TK_IN, PATTERN_CASE, 0},
|
||||||
{TK_PAREN_OPEN, CASE_LIST_NS, PATTERN_CASE, 0},
|
{TK_PAREN_OPEN, CASE_LIST_NS, PATTERN_CASE, 0},
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ t_stackmatch g_stackmatch[] =
|
||||||
{TK_DSEMI, COMPLETE_COMMANDS},
|
{TK_DSEMI, COMPLETE_COMMANDS},
|
||||||
{TK_DSEMI, COMPOUND_LIST},
|
{TK_DSEMI, COMPOUND_LIST},
|
||||||
{TK_DSEMI, CASE_LIST_NS},
|
{TK_DSEMI, CASE_LIST_NS},
|
||||||
|
{TK_DSEMI, CMD_SUPERIOR},
|
||||||
{TK_DSEMI, PIPE_SEMI_SEQUENCE},
|
{TK_DSEMI, PIPE_SEMI_SEQUENCE},
|
||||||
{TK_DSEMI, SEQUENCE},
|
{TK_DSEMI, SEQUENCE},
|
||||||
// watch!
|
// watch!
|
||||||
|
|
@ -852,7 +853,7 @@ t_stackmatch g_stackmatch[] =
|
||||||
{COMPOUND_LIST, TK_ELSE},
|
{COMPOUND_LIST, TK_ELSE},
|
||||||
{COMPOUND_LIST, COMPOUND_LIST},
|
{COMPOUND_LIST, COMPOUND_LIST},
|
||||||
{COMPOUND_LIST, COMPLETE_CONDITION},
|
{COMPOUND_LIST, COMPLETE_CONDITION},
|
||||||
{CLOSE_LIST, PATTERN_CASE},
|
{CLOSE_LIST, PATTERN},
|
||||||
{CLOSE_LIST, FUNC_NAME},
|
{CLOSE_LIST, FUNC_NAME},
|
||||||
{SUBSHELL, LINEBREAK},
|
{SUBSHELL, LINEBREAK},
|
||||||
{SUBSHELL, COMPLETE_COMMANDS},
|
{SUBSHELL, COMPLETE_COMMANDS},
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ int ft_parse(t_btree **ast, t_list **token, t_parser *parser)
|
||||||
while (*token)
|
while (*token)
|
||||||
{
|
{
|
||||||
produce_sym(&parser->stack, parser->new_sym, token);
|
produce_sym(&parser->stack, parser->new_sym, token);
|
||||||
// DG("new sym %s", read_state(*parser->new_sym));
|
DG("new sym %s", read_state(*parser->new_sym));
|
||||||
if (eval_sym(&parser->stack, *parser->new_sym))
|
if (eval_sym(&parser->stack, *parser->new_sym))
|
||||||
return ((parser->state = ERROR));
|
return ((parser->state = ERROR));
|
||||||
else
|
else
|
||||||
|
|
@ -52,7 +52,7 @@ int ft_parse(t_btree **ast, t_list **token, t_parser *parser)
|
||||||
else
|
else
|
||||||
parser->state = UNDEFINED;
|
parser->state = UNDEFINED;
|
||||||
build_tree(ast, token);
|
build_tree(ast, token);
|
||||||
btree_print(STDBUG, *ast, &ft_putast);
|
// btree_print(STDBUG, *ast, &ft_putast);
|
||||||
if ((end_instruction(&parser->stack) && !(*token)->next))
|
if ((end_instruction(&parser->stack) && !(*token)->next))
|
||||||
insert_linebreak(token);
|
insert_linebreak(token);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue