working on job_control, need to catch Jack work's
This commit is contained in:
parent
48dc3d7c70
commit
ad5bea849e
24 changed files with 515 additions and 161 deletions
|
|
@ -63,26 +63,29 @@ exec/bad_fd.c\
|
||||||
exec/error_badidentifier.c\
|
exec/error_badidentifier.c\
|
||||||
exec/exec_ampersand.c\
|
exec/exec_ampersand.c\
|
||||||
exec/exec_and_if.c\
|
exec/exec_and_if.c\
|
||||||
exec/exec_case.c\
|
|
||||||
exec/exec_case_branch.c\
|
exec/exec_case_branch.c\
|
||||||
exec/exec_command.c\
|
exec/exec_command.c\
|
||||||
exec/exec_default.c\
|
exec/exec_default.c\
|
||||||
exec/exec_elif.c\
|
exec/exec_elif.c\
|
||||||
exec/exec_else.c\
|
exec/exec_else.c\
|
||||||
exec/exec_for.c\
|
|
||||||
exec/exec_func.c\
|
exec/exec_func.c\
|
||||||
exec/exec_if.c\
|
exec/exec_leaf.c\
|
||||||
|
exec/exec_math.c\
|
||||||
exec/exec_or_if.c\
|
exec/exec_or_if.c\
|
||||||
exec/exec_pipe.c\
|
exec/exec_pipe.c\
|
||||||
exec/exec_semi.c\
|
exec/exec_semi.c\
|
||||||
exec/exec_until.c\
|
exec/exec_until.c\
|
||||||
exec/exec_var.c\
|
exec/exec_var.c\
|
||||||
exec/exec_while.c\
|
|
||||||
exec/exec_math.c\
|
|
||||||
exec/fd_is_valid.c\
|
exec/fd_is_valid.c\
|
||||||
exec/ft_exec.c\
|
exec/ft_exec.c\
|
||||||
exec/ft_findexec.c\
|
exec/ft_findexec.c\
|
||||||
|
exec/launch_builtin.c\
|
||||||
|
exec/launch_case.c\
|
||||||
|
exec/launch_file.c\
|
||||||
|
exec/launch_for.c\
|
||||||
|
exec/launch_if.c\
|
||||||
exec/launch_process.c\
|
exec/launch_process.c\
|
||||||
|
exec/launch_while.c\
|
||||||
exec/mark_process_status.c\
|
exec/mark_process_status.c\
|
||||||
exec/process_redirect.c\
|
exec/process_redirect.c\
|
||||||
exec/process_reset.c\
|
exec/process_reset.c\
|
||||||
|
|
@ -98,6 +101,13 @@ exec/redirect_less.c\
|
||||||
exec/redirect_lessand.c\
|
exec/redirect_lessand.c\
|
||||||
exec/set_exitstatus.c\
|
exec/set_exitstatus.c\
|
||||||
exec/set_process.c\
|
exec/set_process.c\
|
||||||
|
exec/set_process_case.c\
|
||||||
|
exec/set_process_cmd.c\
|
||||||
|
exec/set_process_for.c\
|
||||||
|
exec/set_process_if.c\
|
||||||
|
exec/set_process_map.c\
|
||||||
|
exec/set_process_while.c\
|
||||||
|
exec/token_to_argv.c\
|
||||||
glob/command_getoutput.c\
|
glob/command_getoutput.c\
|
||||||
glob/dir_glob.c\
|
glob/dir_glob.c\
|
||||||
glob/esc_print.c\
|
glob/esc_print.c\
|
||||||
|
|
@ -108,10 +118,12 @@ glob/expand_home.c\
|
||||||
glob/expand_var.c\
|
glob/expand_var.c\
|
||||||
glob/ft_strsplit_esc.c\
|
glob/ft_strsplit_esc.c\
|
||||||
glob/ft_strsplit_spe.c\
|
glob/ft_strsplit_spe.c\
|
||||||
|
glob/gen_tab_esc.c\
|
||||||
glob/glob.c\
|
glob/glob.c\
|
||||||
glob/is_char_esc.c\
|
glob/is_char_esc.c\
|
||||||
glob/lib_perso/ft_ld_back.c\
|
glob/lib_perso/ft_ld_back.c\
|
||||||
glob/lib_perso/ft_ld_clear.c\
|
glob/lib_perso/ft_ld_clear.c\
|
||||||
|
glob/lib_perso/ft_ld_copy.c\
|
||||||
glob/lib_perso/ft_ld_del.c\
|
glob/lib_perso/ft_ld_del.c\
|
||||||
glob/lib_perso/ft_ld_front.c\
|
glob/lib_perso/ft_ld_front.c\
|
||||||
glob/lib_perso/ft_ld_new.c\
|
glob/lib_perso/ft_ld_new.c\
|
||||||
|
|
@ -128,6 +140,8 @@ glob/lib_perso/ft_strsubf.c\
|
||||||
glob/lib_perso/ft_tabdel.c\
|
glob/lib_perso/ft_tabdel.c\
|
||||||
glob/lib_perso/ft_tablen.c\
|
glob/lib_perso/ft_tablen.c\
|
||||||
glob/match_pattern.c\
|
glob/match_pattern.c\
|
||||||
|
glob/tab_esc_copy.c\
|
||||||
|
glob/word_is_assignment.c\
|
||||||
hash_table/ft_add_hash.c\
|
hash_table/ft_add_hash.c\
|
||||||
hash_table/hash.c\
|
hash_table/hash.c\
|
||||||
hash_table/hash_free.c\
|
hash_table/hash_free.c\
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */
|
/* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/03/07 16:55:12 by wescande ### ########.fr */
|
/* Updated: 2017/03/07 20:50:23 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -63,7 +63,6 @@ struct s_data_cond
|
||||||
|
|
||||||
struct s_data_list
|
struct s_data_list
|
||||||
{
|
{
|
||||||
char *word;
|
|
||||||
t_ld *list_word;
|
t_ld *list_word;
|
||||||
t_btree *content;
|
t_btree *content;
|
||||||
};
|
};
|
||||||
|
|
@ -76,7 +75,7 @@ union u_process_data
|
||||||
struct s_data_cond d_else;
|
struct s_data_cond d_else;
|
||||||
struct s_data_cond d_elif;
|
struct s_data_cond d_elif;
|
||||||
struct s_data_list d_for;
|
struct s_data_list d_for;
|
||||||
// struct s_data_cond case;
|
struct s_data_list d_case;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum e_process_type
|
enum e_process_type
|
||||||
|
|
@ -140,8 +139,8 @@ int exec_leaf(t_btree **ast);
|
||||||
|
|
||||||
//int exec_while(t_btree **ast);
|
//int exec_while(t_btree **ast);
|
||||||
//int exec_if(t_btree **ast);
|
//int exec_if(t_btree **ast);
|
||||||
//int exec_elif(t_btree **ast);
|
int exec_elif(t_btree **ast);
|
||||||
//int exec_else(t_btree **ast);
|
int exec_else(t_btree **ast);
|
||||||
//int exec_until(t_btree **ast);
|
//int exec_until(t_btree **ast);
|
||||||
//int exec_default(t_btree **ast);
|
//int exec_default(t_btree **ast);
|
||||||
int exec_var(t_btree **ast);
|
int exec_var(t_btree **ast);
|
||||||
|
|
@ -174,6 +173,7 @@ char *ft_findexec(char *path, char *file);
|
||||||
void set_exitstatus(int status, int override);
|
void set_exitstatus(int status, int override);
|
||||||
|
|
||||||
void ast_free(void *data, size_t content_size);
|
void ast_free(void *data, size_t content_size);
|
||||||
|
t_btree *ast_copy(t_btree *tree);
|
||||||
void redir_free(void *data, size_t content_size);
|
void redir_free(void *data, size_t content_size);
|
||||||
|
|
||||||
char **token_to_argv(t_ld *ld, int do_match);
|
char **token_to_argv(t_ld *ld, int do_match);
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/01/04 16:31:18 by wescande #+# #+# */
|
/* Created: 2017/01/04 16:31:18 by wescande #+# #+# */
|
||||||
/* Updated: 2017/03/03 20:39:05 by wescande ### ########.fr */
|
/* Updated: 2017/03/07 20:40:28 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -64,6 +64,8 @@ typedef struct s_bquote
|
||||||
char **glob(char *str, unsigned char *esc,
|
char **glob(char *str, unsigned char *esc,
|
||||||
unsigned char *dbl_esc, int do_match);
|
unsigned char *dbl_esc, int do_match);
|
||||||
void esc_print(char *str, unsigned char *esc);
|
void esc_print(char *str, unsigned char *esc);
|
||||||
|
int word_is_assignment(char **content);
|
||||||
|
void *tab_esc_copy(void *content);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** return TRUE if path file is a directory.
|
** return TRUE if path file is a directory.
|
||||||
|
|
@ -120,6 +122,7 @@ t_ld *ft_ld_back(t_ld *ld);
|
||||||
t_ld *ft_ld_swap(t_ld *l_cur);
|
t_ld *ft_ld_swap(t_ld *l_cur);
|
||||||
char **ft_ld_to_tab(t_ld *ld);
|
char **ft_ld_to_tab(t_ld *ld);
|
||||||
t_ld *ft_ld_order(t_ld *ld, int (*f)(), void (*del)());
|
t_ld *ft_ld_order(t_ld *ld, int (*f)(), void (*del)());
|
||||||
|
t_ld *ft_ld_copy(t_ld *src, void *(*f)(void *elem));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** str:
|
** str:
|
||||||
|
|
|
||||||
25
42sh/src/exec/ast_copy.c
Normal file
25
42sh/src/exec/ast_copy.c
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* ast_copy.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 20:44:42 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 20:50:43 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "exec.h"
|
||||||
|
|
||||||
|
t_btree *ast_copy(t_btree *tree)
|
||||||
|
{
|
||||||
|
t_btree *node;
|
||||||
|
|
||||||
|
if (!tree)
|
||||||
|
return (NULL);
|
||||||
|
node = btree_create_node(tree->item, tree->content_size);
|
||||||
|
node->left = ast_copy(tree->left);
|
||||||
|
node->right = ast_copy(tree->right);
|
||||||
|
return (node);
|
||||||
|
}
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* exec_if.c :+: :+: :+: */
|
/* exec_case_branch.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/02/06 18:07:31 by ariard #+# #+# */
|
/* Created: 2017/03/07 20:33:45 by wescande #+# #+# */
|
||||||
/* Updated: 2017/03/06 19:36:55 by ariard ### ########.fr */
|
/* Updated: 2017/03/07 20:34:48 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
/* ************************************************************************** */
|
|
||||||
/* */
|
|
||||||
/* ::: :::::::: */
|
|
||||||
/* exec_until.c :+: :+: :+: */
|
|
||||||
/* +:+ +:+ +:+ */
|
|
||||||
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
|
|
||||||
/* +#+#+#+#+#+ +#+ */
|
|
||||||
/* Created: 2017/02/06 20:42:20 by ariard #+# #+# */
|
|
||||||
/* Updated: 2017/03/06 19:37:02 by ariard ### ########.fr */
|
|
||||||
/* */
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
#include "exec.h"
|
|
||||||
|
|
||||||
int exec_for(t_btree **ast)
|
|
||||||
{
|
|
||||||
t_astnode *node;
|
|
||||||
t_ld *temp;
|
|
||||||
char **av;
|
|
||||||
char *var;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
node = (*ast)->item;
|
|
||||||
temp = node->data.cmd.wordlist;
|
|
||||||
var = ((char **)(temp->content))[0];
|
|
||||||
if (ft_isdigit(var[0]))
|
|
||||||
return (error_badidentifier(var));
|
|
||||||
temp = temp->next;
|
|
||||||
while (temp)
|
|
||||||
{
|
|
||||||
i = 0;
|
|
||||||
av = token_to_argv(temp, 1);
|
|
||||||
while (av[i])
|
|
||||||
{
|
|
||||||
builtin_setenv("setenv", (char*[]){var, av[i], 0},
|
|
||||||
data_singleton()->local_var);
|
|
||||||
ft_exec(&(*ast)->right);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
temp = temp->next;
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */
|
/* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/03/07 16:20:18 by wescande ### ########.fr */
|
/* Updated: 2017/03/07 17:22:42 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -22,8 +22,8 @@ t_itof g_execmap[] =
|
||||||
{TK_PIPE, &exec_pipe},
|
{TK_PIPE, &exec_pipe},
|
||||||
{TK_WHILE, &exec_leaf},
|
{TK_WHILE, &exec_leaf},
|
||||||
{TK_IF, &exec_leaf},
|
{TK_IF, &exec_leaf},
|
||||||
{TK_ELIF, &exec_leaf},
|
{TK_ELIF, &exec_elif},
|
||||||
{TK_ELSE, &exec_leaf},
|
{TK_ELSE, &exec_else},
|
||||||
{TK_UNTIL, &exec_leaf},
|
{TK_UNTIL, &exec_leaf},
|
||||||
{TK_FOR, &exec_leaf},
|
{TK_FOR, &exec_leaf},
|
||||||
{TK_CASE, &exec_leaf},
|
{TK_CASE, &exec_leaf},
|
||||||
|
|
|
||||||
68
42sh/src/exec/launch_case.c
Normal file
68
42sh/src/exec/launch_case.c
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* launch_case.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 19:02:23 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 20:38:19 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "exec.h"
|
||||||
|
/*
|
||||||
|
int exec_case(t_btree **ast)
|
||||||
|
{
|
||||||
|
t_astnode *node;
|
||||||
|
char **av;
|
||||||
|
t_exec *exec;
|
||||||
|
|
||||||
|
(void)ast;
|
||||||
|
exec = &data_singleton()->exec;
|
||||||
|
exec->attrs &= ~EXEC_CASE_BRANCH;
|
||||||
|
|
||||||
|
node = (*ast)->item;
|
||||||
|
av = token_to_argv(node->data.cmd.wordlist, 1);
|
||||||
|
exec->case_pattern = av;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int do_case(t_process *p)
|
||||||
|
{
|
||||||
|
t_exec *exec;
|
||||||
|
|
||||||
|
exec = &data_singleton()->exec;
|
||||||
|
exec->attrs &= ~EXEC_CASE_BRANCH;
|
||||||
|
exec->case_pattern = token_to_argv(p->data.d_case.list_word, 1);
|
||||||
|
/* ft_exec(&p->data.d_if.condition);
|
||||||
|
if (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0")))
|
||||||
|
{
|
||||||
|
exec->attrs |= EXEC_IF_BRANCH;
|
||||||
|
ft_exec(&p->data.d_if.content);
|
||||||
|
}
|
||||||
|
return (ft_atoi(ft_getenv(data_singleton()->env, "?")));*/
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int launch_case(t_process *p)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
if (SH_IS_INTERACTIVE(data_singleton()->opts))
|
||||||
|
{
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0)
|
||||||
|
{
|
||||||
|
data_singleton()->opts &= ~SH_INTERACTIVE;
|
||||||
|
data_singleton()->opts &= ~SH_OPTS_JOBC;
|
||||||
|
exit(do_case(p));
|
||||||
|
}
|
||||||
|
else if (pid > 0)
|
||||||
|
return (pid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
do_case(p);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/03/07 14:53:31 by jhalford #+# #+# */
|
/* Created: 2017/03/07 14:53:31 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/03/07 16:49:31 by wescande ### ########.fr */
|
/* Updated: 2017/03/07 17:08:16 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -40,6 +40,7 @@ int launch_file(t_process *p)
|
||||||
exit (1);
|
exit (1);
|
||||||
(*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env);
|
(*p->data.cmd.execf)(p->data.cmd.path, p->data.cmd.av, data_singleton()->env);
|
||||||
ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
|
ft_dprintf(2, "{red}%s: internal execve error on %s{eoc}\n", SHELL_NAME, p->data.cmd.av[0]);
|
||||||
|
exit(42);
|
||||||
}
|
}
|
||||||
else if (pid > 0)
|
else if (pid > 0)
|
||||||
return (pid);
|
return (pid);
|
||||||
|
|
|
||||||
92
42sh/src/exec/launch_for.c
Normal file
92
42sh/src/exec/launch_for.c
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* launch_for.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 17:34:43 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 19:00:56 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "exec.h"
|
||||||
|
|
||||||
|
static int do_for(t_process *p)
|
||||||
|
{
|
||||||
|
t_ld *temp;
|
||||||
|
int i;
|
||||||
|
char **av;
|
||||||
|
char *var;
|
||||||
|
|
||||||
|
temp = p->data.d_for.list_word;
|
||||||
|
var = ((char **)temp->content)[0];
|
||||||
|
if (!word_is_assignment(temp->content))
|
||||||
|
return (error_badidentifier(var));
|
||||||
|
temp = temp->next;
|
||||||
|
while (temp)
|
||||||
|
{
|
||||||
|
i = -1;
|
||||||
|
av = token_to_argv(temp, 1);
|
||||||
|
while (av[++i])
|
||||||
|
{
|
||||||
|
builtin_setenv("setenv", (char*[]){var, av[i], 0},
|
||||||
|
data_singleton()->local_var);
|
||||||
|
ft_exec(&p->data.d_for.content);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
temp = temp->next;
|
||||||
|
}
|
||||||
|
return (ft_atoi(ft_getenv(data_singleton()->env, "?")));
|
||||||
|
}
|
||||||
|
|
||||||
|
int launch_for(t_process *p)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
if (SH_IS_INTERACTIVE(data_singleton()->opts))
|
||||||
|
{
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0)
|
||||||
|
{
|
||||||
|
data_singleton()->opts &= ~SH_INTERACTIVE;
|
||||||
|
data_singleton()->opts &= ~SH_OPTS_JOBC;
|
||||||
|
exit(do_for(p));
|
||||||
|
}
|
||||||
|
else if (pid > 0)
|
||||||
|
return (pid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
do_for(p);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
int exec_for(t_btree **ast)
|
||||||
|
{
|
||||||
|
t_astnode *node;
|
||||||
|
t_ld *temp;
|
||||||
|
char **av;
|
||||||
|
char *var;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
node = (*ast)->item;
|
||||||
|
temp = node->data.cmd.wordlist;
|
||||||
|
var = ((char **)(temp->content))[0];
|
||||||
|
if (ft_isdigit(var[0]))
|
||||||
|
return (error_badidentifier(var));
|
||||||
|
temp = temp->next;
|
||||||
|
while (temp)
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
av = token_to_argv(temp, 1);
|
||||||
|
while (av[i])
|
||||||
|
{
|
||||||
|
builtin_setenv("setenv", (char*[]){var, av[i], 0},
|
||||||
|
data_singleton()->local_var);
|
||||||
|
ft_exec(&(*ast)->right);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
temp = temp->next;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}*/
|
||||||
65
42sh/src/exec/launch_if.c
Normal file
65
42sh/src/exec/launch_if.c
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* launch_if.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 17:26:53 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 18:36:02 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "exec.h"
|
||||||
|
|
||||||
|
static int do_if(t_process *p)
|
||||||
|
{
|
||||||
|
t_exec *exec;
|
||||||
|
|
||||||
|
exec = &data_singleton()->exec;
|
||||||
|
exec->attrs &= ~EXEC_IF_BRANCH;
|
||||||
|
ft_exec(&p->data.d_if.condition);
|
||||||
|
if (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0")))
|
||||||
|
{
|
||||||
|
exec->attrs |= EXEC_IF_BRANCH;
|
||||||
|
ft_exec(&p->data.d_if.content);
|
||||||
|
}
|
||||||
|
return (ft_atoi(ft_getenv(data_singleton()->env, "?")));
|
||||||
|
}
|
||||||
|
|
||||||
|
int launch_if(t_process *p)
|
||||||
|
{
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
if (SH_IS_INTERACTIVE(data_singleton()->opts))
|
||||||
|
{
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0)
|
||||||
|
{
|
||||||
|
data_singleton()->opts &= ~SH_INTERACTIVE;
|
||||||
|
data_singleton()->opts &= ~SH_OPTS_JOBC;
|
||||||
|
exit(do_if(p));
|
||||||
|
}
|
||||||
|
else if (pid > 0)
|
||||||
|
return (pid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
do_if(p);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
int exec_if(t_btree **ast)
|
||||||
|
{
|
||||||
|
t_exec *exec;
|
||||||
|
|
||||||
|
exec = &data_singleton()->exec;
|
||||||
|
|
||||||
|
exec->attrs &= ~EXEC_IF_BRANCH;
|
||||||
|
ft_exec(&(*ast)->left);
|
||||||
|
if (ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") == 0)
|
||||||
|
{
|
||||||
|
exec->attrs |= EXEC_IF_BRANCH;
|
||||||
|
ft_exec(&(*ast)->right);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}*/
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */
|
/* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/03/07 16:49:10 by wescande ### ########.fr */
|
/* Updated: 2017/03/07 19:02:40 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -18,10 +18,10 @@ t_itof g_launchmap[] =
|
||||||
{PROCESS_BUILTIN, launch_builtin},
|
{PROCESS_BUILTIN, launch_builtin},
|
||||||
{PROCESS_FILE, launch_file},
|
{PROCESS_FILE, launch_file},
|
||||||
{PROCESS_SUBSHELL, NULL},
|
{PROCESS_SUBSHELL, NULL},
|
||||||
{PROCESS_WHILE, NULL},
|
{PROCESS_WHILE, launch_while},
|
||||||
{PROCESS_IF, NULL},
|
{PROCESS_IF, launch_if},
|
||||||
{PROCESS_FOR, NULL},
|
{PROCESS_FOR, launch_for},
|
||||||
{PROCESS_CASE, NULL},
|
{PROCESS_CASE, launch_case},
|
||||||
{0, NULL}
|
{0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* exec_while.c :+: :+: :+: */
|
/* launch_while.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/01/30 17:33:53 by ariard #+# #+# */
|
/* Created: 2017/03/07 17:20:53 by wescande #+# #+# */
|
||||||
/* Updated: 2017/03/07 16:41:50 by wescande ### ########.fr */
|
/* Updated: 2017/03/07 17:30:16 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "exec.h"
|
#include "exec.h"
|
||||||
|
/*
|
||||||
int exec_while(t_btree **ast)
|
int exec_while(t_btree **ast)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
@ -28,10 +28,19 @@ int exec_while(t_btree **ast)
|
||||||
exit(ret);
|
exit(ret);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
static int do_while(t_process *p)
|
static int do_while(t_process *p)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
ft_exec(&p->data.d_while.condition);
|
||||||
|
ret = ft_atoi(ft_getenv(data_singleton()->env, "?"));
|
||||||
|
while (!(ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0")))
|
||||||
|
{
|
||||||
|
ft_exec(&p->data.d_while.content);
|
||||||
|
ret = ft_atoi(ft_getenv(data_singleton()->env, "?"));
|
||||||
|
ft_exec(&p->data.d_while.condition);
|
||||||
|
}
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,15 +52,15 @@ int launch_while(t_process *p)
|
||||||
{
|
{
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if (pid == 0)
|
if (pid == 0)
|
||||||
exit(do_while(p));
|
|
||||||
else if (pid > 0)
|
|
||||||
{
|
{
|
||||||
p->pid = pid;
|
data_singleton()->opts &= ~SH_INTERACTIVE;
|
||||||
process_setgroup(p, pid);
|
data_singleton()->opts &= ~SH_OPTS_JOBC;
|
||||||
return (0);
|
exit(do_while(p));
|
||||||
}
|
}
|
||||||
|
else if (pid > 0)
|
||||||
|
return (pid);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
do_while(p);
|
do_while(p);
|
||||||
return (1);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
@ -1,29 +1,20 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* exec_if.c :+: :+: :+: */
|
/* set_process_case.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/02/06 18:07:31 by ariard #+# #+# */
|
/* Created: 2017/03/07 20:36:04 by wescande #+# #+# */
|
||||||
/* Updated: 2017/03/06 19:37:20 by ariard ### ########.fr */
|
/* Updated: 2017/03/07 20:51:41 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "exec.h"
|
#include "exec.h"
|
||||||
|
|
||||||
int exec_case(t_btree **ast)
|
int set_process_case(t_process *p, t_btree *ast, t_cmd *cmd)
|
||||||
{
|
{
|
||||||
t_astnode *node;
|
p->data.d_case.list_word = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.wordlist, tab_esc_copy);
|
||||||
char **av;
|
p->data.d_case.content = ast_copy(ast->right);
|
||||||
t_exec *exec;
|
|
||||||
|
|
||||||
(void)ast;
|
|
||||||
exec = &data_singleton()->exec;
|
|
||||||
exec->attrs &= ~EXEC_CASE_BRANCH;
|
|
||||||
|
|
||||||
node = (*ast)->item;
|
|
||||||
av = token_to_argv(node->data.cmd.wordlist, 1);
|
|
||||||
exec->case_pattern = av;
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
@ -1,29 +1,20 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* exec_if.c :+: :+: :+: */
|
/* set_process_for.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/02/06 18:07:31 by ariard #+# #+# */
|
/* Created: 2017/03/07 19:38:05 by wescande #+# #+# */
|
||||||
/* Updated: 2017/03/05 15:12:28 by jhalford ### ########.fr */
|
/* Updated: 2017/03/07 20:51:57 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "exec.h"
|
#include "exec.h"
|
||||||
|
|
||||||
int exec_if(t_btree **ast)
|
int set_process_for(t_process *p, t_btree *ast, t_cmd *cmd)
|
||||||
{
|
{
|
||||||
t_exec *exec;
|
p->data.d_for.list_word = ft_ld_copy(((t_astnode *)ast->item)->data.cmd.wordlist, tab_esc_copy);
|
||||||
|
p->data.d_for.content = ast_copy(ast->right);
|
||||||
exec = &data_singleton()->exec;
|
|
||||||
|
|
||||||
exec->attrs &= ~EXEC_IF_BRANCH;
|
|
||||||
ft_exec(&(*ast)->left);
|
|
||||||
if (ft_strcmp(ft_getenv(data_singleton()->env, "?"), "0") == 0)
|
|
||||||
{
|
|
||||||
exec->attrs |= EXEC_IF_BRANCH;
|
|
||||||
ft_exec(&(*ast)->right);
|
|
||||||
}
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
20
42sh/src/exec/set_process_if.c
Normal file
20
42sh/src/exec/set_process_if.c
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* set_process_if.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 19:19:50 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 20:35:16 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "exec.h"
|
||||||
|
|
||||||
|
int set_process_if(t_process *p, t_btree *ast, t_cmd *cmd)
|
||||||
|
{
|
||||||
|
p->data.d_if.condition = btree_map(ast->left, ast_copy);
|
||||||
|
p->data.d_if.content = btree_map(ast->right, ast_copy);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
20
42sh/src/exec/set_process_while.c
Normal file
20
42sh/src/exec/set_process_while.c
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* set_process_while.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 19:38:10 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 20:51:24 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "exec.h"
|
||||||
|
|
||||||
|
int set_process_while(t_process *p, t_btree *ast, t_cmd *cmd)
|
||||||
|
{
|
||||||
|
p->data.d_while.condition = ast_copy(ast->left);
|
||||||
|
p->data.d_while.content = ast_copy(ast->right);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/01/12 19:00:29 by wescande #+# #+# */
|
/* Created: 2017/01/12 19:00:29 by wescande #+# #+# */
|
||||||
/* Updated: 2017/02/24 22:05:14 by ariard ### ########.fr */
|
/* Updated: 2017/03/07 20:03:35 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -20,36 +20,6 @@
|
||||||
** -t_glob *gl -> struct of expanding
|
** -t_glob *gl -> struct of expanding
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char **gen_tab(const char *pat,
|
|
||||||
const unsigned char *esc,
|
|
||||||
const unsigned char *esc2,
|
|
||||||
int dup)
|
|
||||||
{
|
|
||||||
char **my_tab;
|
|
||||||
|
|
||||||
if (!(my_tab = (char **)malloc(sizeof(char *) * (esc2 ? 4 : 3))))
|
|
||||||
return (NULL);
|
|
||||||
if (dup)
|
|
||||||
{
|
|
||||||
my_tab[0] = ft_strdup(pat);
|
|
||||||
my_tab[1] = ft_strdup((const char *)esc);
|
|
||||||
if (esc2)
|
|
||||||
my_tab[2] = ft_strdup((const char *)esc2);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
my_tab[0] = (char *)pat;
|
|
||||||
my_tab[1] = (char *)esc;
|
|
||||||
if (esc2)
|
|
||||||
my_tab[2] = (char *)esc2;
|
|
||||||
}
|
|
||||||
if (esc2)
|
|
||||||
my_tab[3] = NULL;
|
|
||||||
else
|
|
||||||
my_tab[2] = NULL;
|
|
||||||
return (my_tab);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void iter_on_each(t_expand *me)
|
static void iter_on_each(t_expand *me)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
||||||
45
42sh/src/glob/gen_tab_esc.c
Normal file
45
42sh/src/glob/gen_tab_esc.c
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* gen_tab_esc.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 20:04:40 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 20:07:31 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "glob.h"
|
||||||
|
|
||||||
|
char **gen_tab(const char *pat,
|
||||||
|
const unsigned char *esc,
|
||||||
|
const unsigned char *esc2,
|
||||||
|
int dup)
|
||||||
|
{
|
||||||
|
char **my_tab;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (!(my_tab = (char **)malloc(sizeof(char *) * (esc2 ? 4 : 3))))
|
||||||
|
return (NULL);
|
||||||
|
if (dup)
|
||||||
|
{
|
||||||
|
len = ft_strlen(pat);
|
||||||
|
my_tab[0] = ft_strdup(pat);
|
||||||
|
my_tab[1] = (char *)dup_char_esc(esc, len >> 3);
|
||||||
|
if (esc2)
|
||||||
|
my_tab[2] = (char *)dup_char_esc(esc2, len >> 3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
my_tab[0] = (char *)pat;
|
||||||
|
my_tab[1] = (char *)esc;
|
||||||
|
if (esc2)
|
||||||
|
my_tab[2] = (char *)esc2;
|
||||||
|
}
|
||||||
|
if (esc2)
|
||||||
|
my_tab[3] = NULL;
|
||||||
|
else
|
||||||
|
my_tab[2] = NULL;
|
||||||
|
return (my_tab);
|
||||||
|
}
|
||||||
29
42sh/src/glob/lib_perso/ft_ld_copy.c
Normal file
29
42sh/src/glob/lib_perso/ft_ld_copy.c
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* ft_ld_copy.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 19:42:23 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 20:29:28 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "glob.h"
|
||||||
|
|
||||||
|
t_ld *ft_ld_copy(t_ld *src, void *(*f)(void *elem))
|
||||||
|
{
|
||||||
|
t_ld *dst;
|
||||||
|
void *content;
|
||||||
|
|
||||||
|
dst = NULL;
|
||||||
|
while (src)
|
||||||
|
{
|
||||||
|
content = (*f)(src->content);
|
||||||
|
ft_ld_pushfront(dst, content);
|
||||||
|
src = src->next;
|
||||||
|
}
|
||||||
|
ft_ld_reverse(dst);
|
||||||
|
return (dst);
|
||||||
|
}
|
||||||
21
42sh/src/glob/tab_esc_copy.c
Normal file
21
42sh/src/glob/tab_esc_copy.c
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* set_process_for.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 19:38:05 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 20:40:30 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "glob.h"
|
||||||
|
|
||||||
|
void *tab_esc_copy(void *content)
|
||||||
|
{
|
||||||
|
char **ch_cont;
|
||||||
|
|
||||||
|
ch_cont = (char **)content;
|
||||||
|
return (gen_tab(ch_cont[0], (unsigned char *)ch_cont[1], (unsigned char *)ch_cont[2], 1));
|
||||||
|
}
|
||||||
35
42sh/src/glob/word_is_assignment.c
Normal file
35
42sh/src/glob/word_is_assignment.c
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* word_is_assignment.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: wescande <wescande@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2017/03/07 18:59:11 by wescande #+# #+# */
|
||||||
|
/* Updated: 2017/03/07 18:59:38 by wescande ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "glob.h"
|
||||||
|
|
||||||
|
int word_is_assignment(char **content)
|
||||||
|
{
|
||||||
|
const int len = ft_strlen(content[0]);
|
||||||
|
int pos;
|
||||||
|
char c;
|
||||||
|
const unsigned char *esc = (const unsigned char *)content[1];
|
||||||
|
|
||||||
|
pos = -1;
|
||||||
|
if (ft_isdigit(content[0][0]))
|
||||||
|
return (0);
|
||||||
|
while (++pos < len)
|
||||||
|
{
|
||||||
|
if (is_char_esc(esc, content[0], content[0] + pos))
|
||||||
|
return (0);
|
||||||
|
c = content[0][pos];
|
||||||
|
if (!ft_isalnum(c) && c != '_')
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -6,28 +6,31 @@
|
||||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2016/12/03 12:07:11 by jhalford #+# #+# */
|
/* Created: 2016/12/03 12:07:11 by jhalford #+# #+# */
|
||||||
/* Updated: 2017/03/05 17:07:26 by ariard ### ########.fr */
|
/* Updated: 2017/03/07 19:00:22 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "lexer.h"
|
#include "lexer.h"
|
||||||
|
/*
|
||||||
static int word_is_assignment(t_token *token)
|
static int word_is_assignment(t_token *token)
|
||||||
{
|
{
|
||||||
const int len = ft_strlen(token->data);
|
const int len = ft_strlen(token->data);
|
||||||
int pos = -1;
|
int pos;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
|
pos = -1;
|
||||||
|
if (ft_isdigit(token->data[pos]))
|
||||||
|
return (0);
|
||||||
while (++pos < len)
|
while (++pos < len)
|
||||||
{
|
{
|
||||||
if (is_char_esc(token->esc, token->data, token->data + pos))
|
if (is_char_esc(token->esc, token->data, token->data + pos))
|
||||||
return (0);
|
return (0);
|
||||||
c = token->data[pos];
|
c = token->data[pos];
|
||||||
if (!ft_isalnum(c) && c != '_' && c != '-')
|
if (!ft_isalnum(c) && c != '_')
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
int lexer_word(t_list **alst, t_lexer *lexer)
|
int lexer_word(t_list **alst, t_lexer *lexer)
|
||||||
{
|
{
|
||||||
|
|
@ -42,7 +45,8 @@ int lexer_word(t_list **alst, t_lexer *lexer)
|
||||||
lexer->state = state;
|
lexer->state = state;
|
||||||
return (lexer_lex(alst, lexer));
|
return (lexer_lex(alst, lexer));
|
||||||
}
|
}
|
||||||
if (lexer->str[lexer->pos] == '=' && word_is_assignment(token))
|
if (lexer->str[lexer->pos] == '='
|
||||||
|
&& word_is_assignment((char *[]){token->data, (char *)token->esc}))
|
||||||
{
|
{
|
||||||
lexer->state = ASSIGNEMENT_WORD;
|
lexer->state = ASSIGNEMENT_WORD;
|
||||||
return (lexer_lex(alst, lexer));
|
return (lexer_lex(alst, lexer));
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
|
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2017/02/15 20:49:15 by ariard #+# #+# */
|
/* Created: 2017/02/15 20:49:15 by ariard #+# #+# */
|
||||||
/* Updated: 2017/03/06 19:36:34 by ariard ### ########.fr */
|
/* Updated: 2017/03/07 20:10:10 by wescande ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -68,19 +68,15 @@ int add_cmd(t_btree **ast, t_list **lst)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
t_astnode *node;
|
t_astnode *node;
|
||||||
char **my_tab;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
i = 0;
|
i = -1;
|
||||||
while (i < 14)
|
while (++i < 14)
|
||||||
{
|
|
||||||
if (g_distrostree[i].test(ast, lst) == 1)
|
if (g_distrostree[i].test(ast, lst) == 1)
|
||||||
{
|
{
|
||||||
DG("add : %d", i);
|
DG("add : %d", i);
|
||||||
return (g_distrostree[i].add(ast, lst));
|
return (g_distrostree[i].add(ast, lst));
|
||||||
}
|
}
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (!*ast)
|
if (!*ast)
|
||||||
gen_node(ast);
|
gen_node(ast);
|
||||||
else if (no_del_token(ast, lst))
|
else if (no_del_token(ast, lst))
|
||||||
|
|
@ -92,16 +88,14 @@ int add_cmd(t_btree **ast, t_list **lst)
|
||||||
else
|
else
|
||||||
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)
|
||||||
{
|
/* if ((my_tab = (char **)malloc(sizeof(char *) * 4)))
|
||||||
DG("add cmd default");
|
|
||||||
if ((my_tab = (char **)malloc(sizeof(char *) * 4)))
|
|
||||||
{
|
{
|
||||||
my_tab[0] = ft_strdup(token->data);
|
my_tab[0] = ft_strdup(token->data);
|
||||||
my_tab[1] = (char *)dup_char_esc(token->esc, token->size >> 3);
|
my_tab[1] = (char *)dup_char_esc(token->esc, token->size >> 3);
|
||||||
my_tab[2] = (char *)dup_char_esc(token->esc2, token->size >> 3);
|
my_tab[2] = (char *)dup_char_esc(token->esc2, token->size >> 3);
|
||||||
my_tab[3] = NULL;
|
my_tab[3] = NULL;
|
||||||
}
|
}*/
|
||||||
ft_ld_pushback(&node->data.cmd.token, my_tab);
|
ft_ld_pushback(&node->data.cmd.token,
|
||||||
}
|
gen_tab(token->data, token->esc, token->esc2, 1));
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue