Merge branch 'pda' of https://github.com/jzck/42sh into pda

"recup work last night"
This commit is contained in:
Antoine Riard 2017-03-06 14:51:32 +01:00
commit 65930ddf07
17 changed files with 78 additions and 43 deletions

View file

@ -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

View file

@ -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

View file

@ -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);
} }

View file

@ -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);
} }

View file

@ -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;
} }

View file

@ -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},

View file

@ -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 == '|')

View file

@ -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)

View file

@ -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);

View file

@ -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)

View file

@ -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);

View file

@ -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;

View file

@ -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);
} }

View file

@ -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);
} }

View file

@ -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},

View file

@ -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},

View file

@ -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