pipeline working, added stack of old qstates to make the FSM adiabatic

This commit is contained in:
Jack Halford 2016-11-28 19:30:31 +01:00
parent b59f05eb77
commit 569812ddcb
37 changed files with 366 additions and 205 deletions

View file

@ -67,8 +67,13 @@ $(D_OBJ)/%.o: $(D_SRC)/exec/%.c includes/exec.h
@$(CC) $(O_INC) $(W_FLAGS) -c $< -o $@ $(D_FLAGS)
@echo "Compiling "$<"..."
libft/libft.a:
@$(MAKE) -C libft/ 2>/dev/null
libft/libft.a: libft/src/*/*.c
@echo "libft/libft.a"
@$(MAKE) -C libft 2>/dev/null
libft:
@echo "libft"
@$(MAKE) -C libft 2>/dev/null
clean:
$(RM) $(D_OBJ)

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */
/* Updated: 2016/11/27 22:57:06 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:26:20 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -16,10 +16,7 @@
# include "minishell.h"
# define PIPE_READ 0
# define PIPE_WRITE 1
# define STDIN 0
# define STDOUT 1
typedef long long t_type;
typedef struct s_exec t_exec;
struct s_exec
@ -36,6 +33,10 @@ int exec_semi(t_btree *ast, t_data *data);
int exec_pipe(t_btree *ast, t_data *data);
int exec_less(t_btree *ast, t_data *data);
int exec_great(t_btree *ast, t_data *data);
int exec_dgreat(t_btree *ast, t_data *data);
int exec_command(t_btree *ast, t_data *data);
int ft_cmd_process(char **argv, t_data *data);
int ft_cmd_exec(char *execpath, char **argv, t_data *data);
#endif

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 15:31:42 by jhalford #+# #+# */
/* Updated: 2016/11/14 18:22:04 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:36:29 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,12 +6,13 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 13:07:44 by jhalford #+# #+# */
/* Updated: 2016/11/27 16:10:09 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:53:42 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef MINISHELL_H
# define MINISHELL_H
# define SHELL_NAME "minishell"
# include "libft.h"
@ -24,8 +25,8 @@
# include <sys/stat.h>
# include <sys/types.h>
# include <signal.h>
# include <fcntl.h>
# define SHELL_NAME "minishell"
typedef enum e_qstate t_qstate;
typedef struct s_data t_data;
@ -45,8 +46,11 @@ struct s_data
char *input;
int input_pos;
t_list *qstack;
t_qstate state_now;
t_qstate state_last;
int fdin;
int fdout;
};
extern t_stof g_builtins[];
@ -55,18 +59,13 @@ extern pid_t g_pid;
void sig_handler(int signo);
int data_init(t_data *data);
int ft_cmd_process(char **argv, char ***env_p);
int ft_cmd_exec(char *execpath, char **argv, char ***env_p);
char **ft_cmd_getav(char *cmd);
int ft_builtin(char **av, char ***env);
int builtin_echo(char **av, char ***env);
int builtin_cd(char **av, char ***env);
int builtin_exit(char **av, char ***env);
int builtin_setenv(char **av, char ***env);
int builtin_unsetenv(char **av, char ***env);
int builtin_env(char **av, char ***env);
int ft_builtin(char **av, t_data *data);
int builtin_echo(char **av, t_data *data);
int builtin_cd(char **av, t_data *data);
int builtin_exit(char **av, t_data *data);
int builtin_setenv(char **av, t_data *data);
int builtin_unsetenv(char **av, t_data *data);
int builtin_env(char **av, t_data *data);
void ft_expand_dollar(char **av, char **env);
char *ft_findexec(char **path, char *file);

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 15:31:42 by jhalford #+# #+# */
/* Updated: 2016/11/14 18:22:04 by jhalford ### ########.fr */
/* Updated: 2016/11/28 16:25:13 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -1,5 +1,16 @@
#include "minishell.h"
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* builtin.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 14:21:34 by jhalford #+# #+# */
/* Updated: 2016/11/28 14:27:36 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
t_stof g_builtin[] = {
{"echo", &builtin_echo},
@ -11,24 +22,18 @@ t_stof g_builtin[] = {
{NULL, NULL},
};
int ft_builtin(char **av, char ***env_p)
int ft_builtin(char **av, t_data *data)
{
int i;
int ret;
char *exitval[2];
char **env;
i = 0;
env = *env_p;
exitval[0] = ft_strdup("?");
while (g_builtin[i].name)
{
if (ft_strcmp(g_builtin[i].name, *av) == 0)
{
ret = (g_builtin[i].f)(av, env_p);
exitval[1] = ft_strdup(ft_itoa(ret));
builtin_setenv(exitval, &env);
*env_p = env;
ret = (g_builtin[i].f)(av, data);
builtin_setenv((char*[3]){"?", ft_itoa(ret)}, data);
return (1);
}
i++;

View file

@ -1,6 +1,6 @@
#include "minishell.h"
#define CDOPT_L 0b001
#define CDOPT_P 0b010
#define CDOPT_L 0x001
#define CDOPT_P 0x002
#define HAS_CDOPT_P(x) (x & CD_OPT_P)
#define HAS_CDOPT_L(x) (x & CD_OPT_L)
#define CDERR_1 "cd: no such file or directory: %s\n"
@ -48,20 +48,17 @@ static int builtin_cd_opts(char **av, int *opts)
return (i);
}
int builtin_cd(char **av, char ***env_p)
int builtin_cd(char **av, t_data *data)
{
int i;
int opts;
char *target;
char *oldpwd[2];
char *pwd[2];
opts = 0;
i = builtin_cd_opts(av, &opts);
if (!(target = builtin_cd_special(av + i, *env_p)))
if (!(target = builtin_cd_special(av + i, data->env)))
return (0);
oldpwd[0] = ft_strdup("OLDPWD");
oldpwd[1] = getcwd(NULL, 0);
builtin_setenv((char*[3]){"OLDPWD", getcwd(NULL, 0)}, data);
if (chdir(target))
{
ft_printf(CDERR_1, target);
@ -69,9 +66,6 @@ int builtin_cd(char **av, char ***env_p)
}
else if (target != av[i])
ft_printf("%s\n", target);
pwd[0] = ft_strdup("PWD");
pwd[1] = getcwd(NULL, 0);
builtin_setenv(pwd, env_p);
builtin_setenv(oldpwd, env_p);
builtin_setenv((char*[3]){"PWD", getcwd(NULL, 0)}, data);
return (0);
}

View file

@ -1,8 +1,20 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* builtin_echo.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 14:21:41 by jhalford #+# #+# */
/* Updated: 2016/11/28 14:22:02 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int builtin_echo(char **av, char ***env_p)
int builtin_echo(char **av, t_data *data)
{
(void)env_p;
(void)data;
av++;
while (*av)
{

View file

@ -1,6 +1,18 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* builtin_env.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 14:14:20 by jhalford #+# #+# */
/* Updated: 2016/11/28 14:28:37 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int builtin_env(char **av, char ***env_p)
int builtin_env(char **av, t_data *data)
{
int i;
char **env;
@ -8,7 +20,7 @@ int builtin_env(char **av, char ***env_p)
i = 1;
env = NULL;
if (!av[1])
ft_sstrprint(*env_p, '\n');
ft_sstrprint(data->env, '\n');
else
{
while (av[i] && ft_strchr(av[i], '='))
@ -17,7 +29,7 @@ int builtin_env(char **av, char ***env_p)
i++;
}
if (av[i])
ft_cmd_process(av + i, env_p);
ft_cmd_process(av + i, data);
}
return (0);
}

View file

@ -1,14 +1,25 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* builtin_exit.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 14:28:41 by jhalford #+# #+# */
/* Updated: 2016/11/28 14:30:07 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int builtin_exit(char **av, char ***env_p)
int builtin_exit(char **av, t_data *data)
{
int status;
(void)env_p;
if (av[1])
status = ft_atoi(av[1]);
else
status = ft_atoi(ft_getenv(*env_p, "?"));
status = ft_atoi(ft_getenv(data->env, "?"));
exit(status);
return (0);
}

View file

@ -1,15 +1,27 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* builtin_setenv.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 14:25:17 by jhalford #+# #+# */
/* Updated: 2016/11/28 14:29:13 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int builtin_setenv(char **av, char ***env_p)
int builtin_setenv(char **av, t_data *data)
{
char *str;
char **env;
env = *env_p;
env = data->env;
if (ft_strcmp(av[0], "setenv") == 0)
av++;
if (!av[0])
ft_sstrprint(*env_p, '\n');
ft_sstrprint(data->env, '\n');
else
{
str = ft_str3join(av[0], "=", av[1]);
@ -22,7 +34,7 @@ int builtin_setenv(char **av, char ***env_p)
}
env++;
}
*env_p = ft_sstradd(*env_p, str);
data->env = ft_sstradd(data->env, str);
}
return (0);
}

View file

@ -1,12 +1,24 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* builtin_unsetenv.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 14:29:17 by jhalford #+# #+# */
/* Updated: 2016/11/28 14:29:50 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int builtin_unsetenv(char **av, char ***env_p)
int builtin_unsetenv(char **av, t_data *data)
{
char **env;
int i;
int j;
env = *env_p;
env = data->env;
/* ft_printf("builtin: %s\n", av[0]); */
i = 1;
while (av[i])

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 17:28:14 by jhalford #+# #+# */
/* Updated: 2016/11/27 23:46:57 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:34:13 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,9 +18,9 @@ int exec_command(t_btree *ast, t_data *data)
node = ast->item;
ft_putstr_fd("befor exec: ", 2);
ft_sstrprint(((t_astnode*)ast->item)->u_data.sstr, ',');
ft_putchar('\n');
ft_cmd_process(node->u_data.sstr, &data->env);
ft_sstrprint_fd(2, ((t_astnode*)ast->item)->u_data.sstr, ',');
ft_putchar_fd('\n', 2);
ft_cmd_process(node->u_data.sstr, data);
ft_putstr_fd("after exec\n", 2);
return (0);
}

View file

@ -0,0 +1,28 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* exec_dgreat.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 18:15:13 by jhalford #+# #+# */
/* Updated: 2016/11/28 18:36:11 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "exec.h"
int exec_dgreat(t_btree *ast, t_data *data)
{
t_astnode *node;
int fd;
node = ast->item;
fd = open(node->u_data.redir.u_word.word, O_WRONLY | O_APPEND | O_CREAT, 0644);
data->fdout = fd;
ft_exec(ast->left, data);
data->fdout = STDOUT;
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 17:27:51 by jhalford #+# #+# */
/* Updated: 2016/11/14 17:44:57 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:35:15 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,9 +14,15 @@
int exec_great(t_btree *ast, t_data *data)
{
(void)ast;
ft_putendl("exec_great");
t_astnode *node;
int fd;
node = ast->item;
fd = open(node->u_data.redir.u_word.word, O_WRONLY | O_TRUNC | O_CREAT, 0644);
data->fdout = fd;
ft_exec(ast->left, data);
ft_exec(ast->right, data);
data->fdout = STDOUT;
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 17:27:08 by jhalford #+# #+# */
/* Updated: 2016/11/14 17:45:04 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:19:26 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,9 +14,13 @@
int exec_less(t_btree *ast, t_data *data)
{
(void)ast;
ft_putendl("exec_less");
ft_exec(ast->left, data);
ft_exec(ast->right, data);
return (0);
t_astnode *node;
int fd;
node = ast->item;
fd = open(node->u_data.redir.u_word.word, O_RDONLY);
dup2(fd, node->u_data.redir.n);
close(fd);
return (ft_exec(ast->left, data));
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 21:13:23 by jhalford #+# #+# */
/* Updated: 2016/11/27 23:49:35 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:10:26 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -14,16 +14,22 @@
int exec_pipe(t_btree *ast, t_data *data)
{
int filedes[2];
int fds[2];
pipe(fds);
ft_dprintf(2, "pipe %i->%i\n", fds[PIPE_WRITE], fds[PIPE_READ]);
data->fdout = fds[PIPE_WRITE];
pipe(filedes);
ft_printf("doing dup2\n");
if ((dup2(filedes[1], 1)) == -1)
return (-1);
ft_exec(ast->left, data);
close(filedes[PIPE_WRITE]);
dup2(filedes[0], 0);
data->fdout = STDOUT;
data->fdin = fds[PIPE_READ];
ft_exec(ast->right, data);
close(filedes[0]);
close(fds[PIPE_WRITE]);
close(fds[PIPE_READ]);
data->fdin = STDIN;
data->fdout = STDOUT;
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:30:32 by jhalford #+# #+# */
/* Updated: 2016/11/27 23:07:42 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:16:13 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,6 +18,7 @@ t_exec g_exec[] =
{TK_PIPE, &exec_pipe},
{TK_LESS, &exec_less},
{TK_GREAT, &exec_great},
{TK_DGREAT, &exec_dgreat},
{TK_COMMAND, &exec_command},
{0, 0},
};

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 13:37:11 by jhalford #+# #+# */
/* Updated: 2016/11/11 20:37:49 by jhalford ### ########.fr */
/* Updated: 2016/11/28 16:46:16 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* lexer_default.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 18:36:21 by jhalford #+# #+# */
/* Updated: 2016/11/28 18:36:40 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "lexer.h"
int lexer_default(t_list **alst, char *str)

View file

@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* lexer_dquote.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 18:36:58 by jhalford #+# #+# */
/* Updated: 2016/11/28 18:43:39 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "lexer.h"
int lexer_dquote(t_list **alst, char *str)
@ -5,7 +17,7 @@ int lexer_dquote(t_list **alst, char *str)
t_token *token;
token = (*alst)->content;
token->type = WORD;
token->type = TK_WORD;
if (*str == '\"')
return (ft_tokenize(&(*alst)->next, str + 1, DEFAULT));
if (*str == '\\')

View file

@ -1,35 +1,54 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* qstate_update.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 16:56:11 by jhalford #+# #+# */
/* Updated: 2016/11/28 19:27:44 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
void qstate_update(t_data *data, char c)
{
t_qstate *now;
t_qstate *last;
t_qstate *state;
t_list **list;
t_list *tmp;
now = &data->state_now;
last = &data->state_last;
if (*now == Q_NONE)
list = &data->qstack;
state = (*list)->content;
ft_lstadd(list, ft_lstnew(NULL, sizeof(t_qstate)));
if (c == -1)
{
tmp = ft_lstpop(list);
ft_lstdelone(&tmp, &ft_lst_cfree);
return ;
}
else if (*state == Q_NONE)
{
if (c == '\\')
{
*last = Q_NONE;
*now = Q_BACKSLASH;
}
*now = c == '\'' ? Q_QUOTE : *now;
*now = c == '\"' ? Q_DQUOTE : *now;
*state = Q_BACKSLASH;
else if (c == '\"')
*state = Q_DQUOTE;
else if (c == '\'')
*state = Q_QUOTE;
}
else if (*now == Q_QUOTE)
*now = c == '\'' ? Q_NONE : *now;
else if (*now == Q_DQUOTE)
else if (*state == Q_QUOTE)
{
if (c == '\'')
*state = Q_NONE;
}
else if (*state == Q_DQUOTE)
{
if (c == '\\')
{
*last = Q_DQUOTE;
*now = Q_BACKSLASH;
}
*now = c == '\"' ? Q_NONE : *now;
}
else if (*now == Q_BACKSLASH)
{
*now = *last;
*state = Q_BACKSLASH;
else if (c == '\"')
*state = Q_NONE;
}
else if (*state == Q_BACKSLASH)
state = (*list)->next->next->content;
*((t_qstate *)(*list)->content) = *state;
}

View file

@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* token_print.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 14:39:01 by jhalford #+# #+# */
/* Updated: 2016/11/28 14:39:08 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "lexer.h"
void token_print(t_list *lst)
@ -7,7 +19,7 @@ void token_print(t_list *lst)
while (lst)
{
token = lst->content;
ft_printf("%#06llx: '%s'\n", token->type, token->data);
ft_dprintf(2, "%#06llx: '%s'\n", token->type, token->data);
lst = lst->next;
}
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 13:44:21 by jhalford #+# #+# */
/* Updated: 2016/11/11 14:39:10 by jhalford ### ########.fr */
/* Updated: 2016/11/28 19:28:23 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -54,7 +54,8 @@ int ft_interactive_sh(t_data *data)
ft_strdel(&data->input);
data->input = ft_memalloc(10);
data->input_pos = 0;
data->state_now = Q_NONE;
data->qstack = ft_lstnew(NULL, sizeof(t_qstate));
*((t_qstate*)data->qstack->content) = Q_NONE;
ft_set_termios(data, 1);
ft_prompt();
while (1)
@ -72,6 +73,7 @@ int ft_interactive_sh(t_data *data)
return (-1);
else if (ret == 2)
{
ft_lstdel(&data->qstack, &ft_lst_cfree);
ft_set_termios(data, 0);
return (0);
}

View file

@ -1,12 +1,12 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_key_basic.c :+: :+: :+: */
/* ft_key_default.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 13:44:23 by jhalford #+# #+# */
/* Updated: 2016/11/10 13:44:23 by jhalford ### ########.fr */
/* Created: 2016/11/28 18:45:23 by jhalford #+# #+# */
/* Updated: 2016/11/28 19:27:47 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 13:44:26 by jhalford #+# #+# */
/* Updated: 2016/11/10 13:44:26 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:54:02 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,11 +18,11 @@ int ft_key_del(t_data *data, char *buf)
(void)data;
(void)buf;
if (!data->input_pos)
return (0);
if (data->input[data->input_pos - 1] == '\n')
return (0);
qstate_update(data, -1);
ft_strcpy(data->input + data->input_pos - 1,
data->input + data->input_pos);
data->input_pos--;

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 13:44:30 by jhalford #+# #+# */
/* Updated: 2016/11/27 20:23:50 by jhalford ### ########.fr */
/* Updated: 2016/11/28 19:02:05 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/10 14:22:34 by jhalford #+# #+# */
/* Updated: 2016/11/10 14:22:48 by jhalford ### ########.fr */
/* Updated: 2016/11/28 15:16:30 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* data_init.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */
/* Updated: 2016/11/28 19:28:22 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
extern char **environ;
@ -6,6 +18,8 @@ int data_init(t_data *data)
{
data->env = ft_sstrdup(environ);
data->history = NULL;
data->fdin = STDIN;
data->fdout = STDOUT;
if (!(data->history = ft_dlstnew(NULL, 0)))
return (-1);
return (0);

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */
/* Updated: 2016/11/14 18:21:50 by jhalford ### ########.fr */
/* Updated: 2016/11/28 14:47:40 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */
/* Updated: 2016/11/14 18:21:50 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:35:12 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,42 +18,42 @@ void ft_putast2(void *nodein)
node = nodein;
if (node->type == TK_SEMI)
ft_putendl("SEMI");
ft_putendl_fd("SEMI", 2);
else if (node->type == TK_PIPE)
ft_putendl("PIPE");
ft_putendl_fd("PIPE", 2);
else if (node->type == TK_COMMAND)
{
ft_putstr("COMMAND: ");
ft_sstrprint(node->u_data.sstr, ',');
ft_putchar('\n');
ft_putstr_fd("COMMAND: ", 2);
ft_sstrprint_fd(2, node->u_data.sstr, ',');
ft_putchar_fd('\n', 2);
}
else if (node->type & TK_REDIR)
{
ft_putnbr(node->u_data.redir.n);
ft_putnbr_fd(node->u_data.redir.n, 2);
if (node->type == TK_GREATAND || node->type == TK_LESSAND)
{
if (node->type == TK_GREATAND)
ft_putstr(">&:");
ft_putstr_fd(">&:", 2);
else
ft_putstr("<&:");
ft_putnbr(node->u_data.redir.u_word.fd);
ft_putstr_fd("<&:", 2);
ft_putnbr_fd(node->u_data.redir.u_word.fd, 2);
if (node->u_data.redir.close)
ft_putstr(" (closed)");
ft_putstr_fd(" (closed)", 2);
}
else
{
if (node->type == TK_GREAT)
ft_putendl(">:");
ft_putendl_fd(">:", 2);
else if (node->type == TK_LESS)
ft_putstr("<:");
ft_putstr_fd("<:", 2);
else if (node->type == TK_DGREAT)
ft_putstr(">>:");
ft_putstr_fd(">>:", 2);
else if (node->type == TK_DLESS)
ft_putstr("<<:");
ft_putstr(node->u_data.redir.u_word.word);
ft_putstr_fd("<<:", 2);
ft_putstr_fd(node->u_data.redir.u_word.word, 2);
}
ft_putchar('\n');
ft_putchar_fd('\n', 2);
}
else
ft_putendl("OTHER");
ft_putendl_fd("OTHER", 2);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 21:13:34 by jhalford #+# #+# */
/* Updated: 2016/11/27 23:17:56 by jhalford ### ########.fr */
/* Updated: 2016/11/28 19:28:03 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,29 +18,31 @@ int main(void)
t_list *token;
t_btree *ast;
token = NULL;
if (data_init(&data))
return (1);
if (signal(SIGINT, sig_handler) == SIG_ERR)
ft_printf("\ncan't catch SIGINT\n");
ft_dprintf(STDERR, "\ncan't catch SIGINT\n");
while (1)
{
if (ft_interactive_sh(&data))
return (1);
ft_printf("command='%s'\n", data.input);
ft_dprintf(STDERR, "command='%s'\n", data.input);
if (ft_tokenize(&token, data.input, DEFAULT))
return (1);
if (!token)
continue ;
token_print(token);
ast = NULL;
if (ft_parse(&ast, &token))
return (1);
btree_print(ast, &ft_putast);
ft_printf("\n--- INFIX BREAKDOWN ---\n");
btree_print(STDERR, ast, &ft_putast);
ft_dprintf(STDERR, "\n--- INFIX BREAKDOWN ---\n");
btree_apply_infix(ast, &ft_putast2);
/* ft_lstdel(&token, &token_free); */
token = NULL;
if (ft_exec(ast, &data))
return (1);
}
return (0);
}

View file

@ -6,21 +6,21 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 21:13:18 by jhalford #+# #+# */
/* Updated: 2016/11/27 22:55:31 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:32:49 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
extern pid_t g_pid;
int ft_cmd_process(char **argv, char ***env_p)
int ft_cmd_process(char **argv, t_data *data)
{
char **path;
char *execpath;
path = ft_strsplit(ft_getenv(*env_p, "PATH"), ':');
ft_expand_dollar(argv, *env_p);
if (ft_builtin(argv, env_p))
path = ft_strsplit(ft_getenv(data->env, "PATH"), ':');
ft_expand_dollar(argv, data->env);
if (ft_builtin(argv, data))
return (0);
else if (ft_strchr(argv[0], '/'))
execpath = argv[0];
@ -29,10 +29,10 @@ int ft_cmd_process(char **argv, char ***env_p)
ft_dprintf(2, "minishell: command not found: %s\n", argv[0]);
return (-1);
}
return (ft_cmd_exec(execpath, argv, env_p));
return (ft_cmd_exec(execpath, argv, data));
}
int ft_cmd_exec(char *execpath, char **argv, char ***env_p)
int ft_cmd_exec(char *execpath, char **argv, t_data *data)
{
pid_t pid;
int status;
@ -43,18 +43,36 @@ int ft_cmd_exec(char *execpath, char **argv, char ***env_p)
ft_dprintf(2, "minishell: permission denied: %s\n", argv[0]);
return (-1);
}
ft_dprintf(2, "gonna fork, in=%i, out=%i\n", data->fdin, data->fdout);
if ((pid = fork()) == -1)
return (-1);
else if (pid == 0)
{
environ = ft_sstrdup(*env_p);
if (data->fdin != STDIN)
{
dup2(data->fdin, STDIN);
close(data->fdin);
}
if (data->fdout != STDOUT)
{
dup2(data->fdout, STDOUT);
close(data->fdout);
}
environ = ft_sstrdup(data->env);
execve(execpath, argv, environ);
}
else
{
g_pid = pid;
wait(&status);
builtin_setenv((char*[2]){"?", ft_itoa(status)}, env_p);
if (data->fdin != STDIN)
close(data->fdin);
if (data->fdout != STDOUT)
close(data->fdout);
else
{
waitpid(pid, &status, 0);
builtin_setenv((char*[3]){"?", ft_itoa(status)}, data);
}
}
return (0);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 11:30:08 by jhalford #+# #+# */
/* Updated: 2016/11/27 20:25:43 by jhalford ### ########.fr */
/* Updated: 2016/11/28 16:38:17 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/14 12:49:45 by jhalford #+# #+# */
/* Updated: 2016/11/14 17:47:33 by jhalford ### ########.fr */
/* Updated: 2016/11/28 18:12:39 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */

View file

@ -1,3 +1,15 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* parse_separator.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 16:21:51 by jhalford #+# #+# */
/* Updated: 2016/11/28 16:21:56 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "parser.h"
int parse_separator(t_btree **ast, t_list **start, t_list **lst)

View file

@ -1,50 +0,0 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* test.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 21:15:49 by jhalford #+# #+# */
/* Updated: 2016/11/27 23:50:57 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft/includes/libft.h"
extern char **environ;
#define PIPE_READ 0
#define PIPE_WRITE 1
#define STDIN 0
#define STDOUT 1
int main(void)
{
pid_t pid;
int fds[2];
pipe(fds);
if ((pid = fork()) == 0)
{
/* child */
dup2(fds[PIPE_WRITE], STDOUT);
/* close(fds[PIPE_READ]); */
/* close(fds[PIPE_WRITE]); */
execv("/bin/ls", (char*[2]){"/bin/ls"});
}
else
wait(NULL);
close(fds[PIPE_WRITE]);
if ((pid = fork()) == 0)
{
/* parent */
dup2(fds[PIPE_READ], STDIN);
/* close(fds[PIPE_READ]); */
execv("/usr/bin/wc", (char*[2]){"/usr/bin/wc", "-l"});
}
else
wait(NULL);
close(fds[PIPE_WRITE]);
close(fds[PIPE_READ]);
}