diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-07-16 09:24:42 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-07-16 09:24:42 +0200 |
| commit | 125470cc6c6c3d8c1184c4c716e20af0d6350b29 (patch) | |
| tree | 9589b21fa8f199c42f99992dca98ec7c9a443437 /src | |
| parent | bcc627a31a6652550be179d1602aae9ccd8db596 (diff) | |
| download | minishell-125470cc6c6c3d8c1184c4c716e20af0d6350b29.tar.gz minishell-125470cc6c6c3d8c1184c4c716e20af0d6350b29.tar.bz2 minishell-125470cc6c6c3d8c1184c4c716e20af0d6350b29.zip | |
Fixing cmd_variable with same names with env_export, Refactoring signal and prompt out of main
Diffstat (limited to 'src')
| -rw-r--r-- | src/env.c | 17 | ||||
| -rw-r--r-- | src/eval/cmd.c | 14 | ||||
| -rw-r--r-- | src/main.c | 150 | ||||
| -rw-r--r-- | src/signal.c | 47 | ||||
| -rw-r--r-- | src/utils.c | 9 |
5 files changed, 78 insertions, 159 deletions
@@ -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) @@ -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); +} |
