aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornass1pro <nass1pro@gmail.com>2020-07-16 10:40:08 +0200
committernass1pro <nass1pro@gmail.com>2020-07-16 10:40:08 +0200
commitd35382262ea5de1ed6d02b6dd7d269367de4e353 (patch)
treec63b0ba102d3d33cde6b24eae856637238ff1248
parent8b5147907d20b149ed7c09c0f8a4a4fa49c313bf (diff)
parentb05db7c497f647c536ec1210be910793c6c7749f (diff)
downloadminishell-d35382262ea5de1ed6d02b6dd7d269367de4e353.tar.gz
minishell-d35382262ea5de1ed6d02b6dd7d269367de4e353.tar.bz2
minishell-d35382262ea5de1ed6d02b6dd7d269367de4e353.zip
Merge branch 'master' of https://github.com/HappyTramp/minishell
-rw-r--r--include/minishell.h13
m---------minishell_test0
-rw-r--r--src/env.c17
-rw-r--r--src/eval/cmd.c14
-rw-r--r--src/main.c150
-rw-r--r--src/signal.c47
-rw-r--r--src/utils.c9
7 files changed, 90 insertions, 160 deletions
diff --git a/include/minishell.h b/include/minishell.h
index d2bc9e7..aebfbf2 100644
--- a/include/minishell.h
+++ b/include/minishell.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/26 15:33:51 by cacharle #+# #+# */
-/* Updated: 2020/07/15 17:00:03 by charles ### ########.fr */
+/* Updated: 2020/07/16 09:17:45 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -67,6 +67,7 @@ char *env_search(t_env env, char *key);
int env_search_index(t_env env, char *key);
char *env_search_first_match(t_env env, const char *haystack);
char *env_export(t_env env, char *key, char *value);
+char *env_export_full(t_env env, char *variable);
/*
** builtin*.c - directory with all builtin commands
@@ -138,6 +139,14 @@ void error_eval_put(enum e_error id, char *content);
void error_put_invalid_identifier(char *prefix, char *identifier);
/*
+** signal.c
+*/
+
+void signal_sigint(int signum);
+void signal_sigquit(int signum);
+void signal_sigterm(int signum);
+
+/*
** utils.c
*/
@@ -153,4 +162,6 @@ size_t utils_var_end(char *name);
bool utils_valid_identifier(char *name);
bool utils_start_with_valid_identifier(char *name);
+void print_prompt(void);
+
#endif
diff --git a/minishell_test b/minishell_test
-Subproject 8a97914ac822703362c22bb6228905f3fbe13d9
+Subproject df5bd1352d817d12061f4af5bdaf1bf19211ebc
diff --git a/src/env.c b/src/env.c
index 9620782..589c83e 100644
--- a/src/env.c
+++ b/src/env.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/28 09:21:24 by cacharle #+# #+# */
-/* Updated: 2020/07/15 17:30:53 by charles ### ########.fr */
+/* Updated: 2020/07/16 08:44:28 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -138,3 +138,18 @@ char *env_export(t_env env, char *key, char *value)
}
return (joined);
}
+
+char *env_export_full(t_env env, char *variable)
+{
+ char *key;
+ char *value;
+
+ key = variable;
+ value = ft_strchr(variable, '=');
+ if (value == NULL)
+ return (NULL);
+ *value = '\0';
+ key = env_export(env, key, value + 1);
+ *value = '=';
+ return (key);
+}
diff --git a/src/eval/cmd.c b/src/eval/cmd.c
index 93a5b23..deb7df7 100644
--- a/src/eval/cmd.c
+++ b/src/eval/cmd.c
@@ -6,7 +6,7 @@
/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/06/14 10:41:31 by charles #+# #+# */
-/* Updated: 2020/07/15 18:16:27 by charles ### ########.fr */
+/* Updated: 2020/07/16 09:12:02 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -54,6 +54,7 @@ int forked_cmd(void *void_param)
t_fork_param_cmd *param;
param = void_param;
+ ft_vecpop(param->env_local, NULL);
if (ft_vecswallow_at(param->env, param->env->size - 1, param->env_local) == NULL)
{
ft_vecdestroy(param->env_local, free);
@@ -78,20 +79,18 @@ int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast)
ast->redirs = NULL;
if ((param.env_local = env_from_array((char*[]){NULL})) == NULL)
return (-1);
+ // TODO generate token list after `=` for variable value preprocessing
while (ast->cmd_argv != NULL
&& ((t_token*)ast->cmd_argv->data)->tag & TAG_IS_STR
&& utils_start_with_valid_identifier(((t_token*)ast->cmd_argv->data)->content))
{
- if (ft_vecpush(param.env_local, ((t_token*)ast->cmd_argv->data)->content) == NULL)
+ if (env_export_full(param.env_local, ((t_token*)ast->cmd_argv->data)->content) == NULL)
return (-1);
- ft_lstpop_front(&ast->cmd_argv, NULL);
+ ft_lstpop_front(&ast->cmd_argv, (void (*)(void*))token_destroy);
}
- /* printf("[\n"); */
- /* ft_veciter(param.env_local, ft_putendl); */
- /* printf("]\n"); */
if (ast->cmd_argv == NULL)
{
- /* printf("--\n"); */
+ ft_vecpop(param.env_local, NULL);
if (ft_vecswallow_at(env, env->size - 1, param.env_local) == NULL)
{
/* printf("hyo\n"); */
@@ -107,7 +106,6 @@ int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast)
ast->cmd_argv = NULL;
return (-1);
}
- /* puts(*argv); */
// can have no command (e.g `< file`)
if (argv[0] == NULL)
diff --git a/src/main.c b/src/main.c
index 9f4dd28..fc55e3e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,7 +6,7 @@
/* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */
-/* Updated: 2020/07/15 15:30:40 by charles ### ########.fr */
+/* Updated: 2020/07/16 09:19:58 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -26,42 +26,6 @@ void token_put(void *v);
void print_level(int level);
void ast_print(int level, t_ast *ast);
-void print_prompt(void)
-{
- printf("\033[0;32m%s\033[0m$ ", getcwd(NULL, 0));
- fflush(stdout);
-}
-
-void signal_sigint(int signum)
-{
- (void)signum;
- if (g_child_pid != -1)
- {
- kill(g_child_pid, SIGINT);
- ft_putchar('\n');
- }
- else
- {
- ft_putchar('\n');
- print_prompt();
- }
-}
-
-void signal_sigquit(int signum)
-{
- (void)signum;
- if (g_child_pid != -1)
- {
- kill(g_child_pid, SIGQUIT);
- ft_putstr("Quit (core dumped)\n");
- }
-}
-
-void signal_sigterm(int signum)
-{
- (void)signum;
-}
-
/*
** TODO
** $?
@@ -113,9 +77,6 @@ int main(int argc, char **argv, char **envp)
return (1);
/* ast_print(0, parser_out->ast); */
- /* printf("\n"); */
- /* fflush(stdout); */
- /* fflush(stderr); */
/* printf("===cmd_argv===\n"); */
/* ft_lstiter(parser_out->ast->cmd_argv, token_debug); */
@@ -157,112 +118,3 @@ int main(int argc, char **argv, char **envp)
ft_vecdestroy(env, free);
return (g_last_status_code);
}
-// else
-// {
-// int ret;
-// char *line;
-//
-// printf("> ");
-// fflush(stdout);
-// while ((ret = ft_getline(STDOUT_FILENO, &line)) == FTGL_OK)
-// {
-// t_ftlst *lex_out = lexer(line);
-// if (lex_out == NULL)
-// return (1);
-//
-// t_ret *parser_out = parse(lex_out);
-//
-// int fds[2] = {MS_NO_FD, MS_NO_FD};
-// int eval_out = eval(fds, env, path, parser_out->ast);
-// (void)eval_out;
-// printf("> ");
-// fflush(stdout);
-// }
-// }
-//
-// ft_htdestroy(path, free);
-// ft_vecdestroy(env, free);
-// return (0);
-// }
-
-
-
-/////////////////////////////////////////////////////////////
-// eval
-/////////////////////////////////////////////////////////////
-
-/* int main(int argc, char **argv, char **envp) */
-/* { */
-/* (void)argc; */
-/* (void)argv; */
-/* (void)envp; */
-/* t_path path; */
-/* t_env env; */
-/* char *line; */
-/* int ret; */
-/* env = env_from_array(envp); */
-/* path = path_update(NULL, env_search(env, "PATH")); */
-
-/* t_ftlst *args1 = NULL; */
-/* ft_lstpush_back(&args1, ft_lstnew(token_new(TAG_STR, "ls"))); */
-/* ft_lstpush_back(&args1, ft_lstnew(token_new(TAG_STR, "-l"))); */
-
-/* t_ftlst *args2 = NULL; */
-/* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "cat"))); */
-/* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "-e"))); */
-/* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "je"))); */
-
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "*.c"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src.c include*.h"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */
-/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); */
-
-/* t_ftlst *redirs = NULL; */
-/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */
-/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); */
-/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_APPEND, NULL))); */
-/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); */
-/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */
-/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo1"))); */
-
-/* t_ast *cmd1 = ast_new(AST_CMD); */
-/* cmd1->cmd_argv = args1; */
-/* cmd1->redirs = NULL; */
-
-/* t_ast *cmd2 = ast_new(AST_CMD); */
-/* cmd2->cmd_argv = args2; */
-/* cmd2->redirs = NULL; */
-
-/* t_ast *op_ast = ast_new(AST_OP); */
-/* op_ast->op.left = cmd1; */
-/* op_ast->op.right = cmd2; */
-/* op_ast->op.sep = TAG_PIPE; */
-
-
-/* int fds[2] = {MS_NO_FD, MS_NO_FD}; */
-/* printf("eval %d\n", eval_cmd(fds, env, path, cmd1)); */
-
-/* char **as = preprocess(l, env); */
-/* printf("%p\n", as); */
-/* printf("%p\n", *as); */
-/* char **tmp = as; */
-/* while (*as != NULL) */
-/* puts(*as++); */
-/* ft_split_destroy(tmp); */
-/* ft_htdestroy(path, free); */
-/* ft_vecdestroy(env, free); */
-/* return (0); */
-/* } */
diff --git a/src/signal.c b/src/signal.c
new file mode 100644
index 0000000..50e07e7
--- /dev/null
+++ b/src/signal.c
@@ -0,0 +1,47 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* signal.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/07/16 09:16:16 by charles #+# #+# */
+/* Updated: 2020/07/16 09:18:21 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "minishell.h"
+#include "eval.h"
+
+void signal_sigint(int signum)
+{
+ (void)signum;
+ g_last_status_code = 130;
+ if (g_child_pid != -1)
+ {
+ kill(g_child_pid, SIGINT);
+ ft_putchar('\n');
+ }
+ else
+ {
+ ft_putchar('\n');
+ print_prompt();
+ }
+}
+
+void signal_sigquit(int signum)
+{
+ (void)signum;
+ g_last_status_code = 131;
+ if (g_child_pid != -1)
+ {
+ kill(g_child_pid, SIGQUIT);
+ ft_putstr("Quit (core dumped)\n");
+ }
+}
+
+void signal_sigterm(int signum)
+{
+ (void)signum;
+}
+
diff --git a/src/utils.c b/src/utils.c
index c4fbb19..e2dd765 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -6,7 +6,7 @@
/* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/28 11:56:31 by cacharle #+# #+# */
-/* Updated: 2020/07/15 17:57:09 by charles ### ########.fr */
+/* Updated: 2020/07/16 09:16:57 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -90,3 +90,10 @@ bool utils_start_with_valid_identifier(char *name)
*equal_ptr = '=';
return (ret);
}
+
+// TODO find a way to flush without fflush
+void print_prompt(void)
+{
+ printf("\033[0;32m%s\033[0m$ ", getcwd(NULL, 0));
+ fflush(stdout);
+}