diff --git a/Makefile b/Makefile index e309068..f9f52cf 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ USERS = $(USER) COMP = -L/goinfre/$(USERS)/.brew/opt/readline/lib LINK = -I/goinfre/$(USERS)/.brew/opt/readline/include -SRCS = srcs/ft_close.c srcs/ft_dups.c srcs/ft_execve.c srcs/ft_fork.c srcs/ft_open.c srcs/ft_pipe.c srcs/ft_waits.c builtins/cd.c builtins/echo.c builtins/env.c builtins/export.c builtins/helpers.c builtins/pwd.c builtins/shell_exit.c builtins/unset.c builtins/utils.c execution/environment.c execution/execute.c execution/heredoc.c execution/misc.c execution/paths.c execution/shell.c execution/signals.c parsing/commands.c parsing/commands_list.c parsing/env.c parsing/expand.c parsing/expand_env.c parsing/free.c parsing/heredoc.c parsing/lexer.c parsing/operator.c parsing/parser.c parsing/parsing_utils.c parsing/token_list.c parsing/word_spliting.c utils/alpha.c utils/contains.c utils/fatal.c utils/ft_atoi.c utils/ft_calloc.c utils/ft_exit.c utils/ft_free.c utils/ft_itoa.c utils/ft_memcpy.c utils/ft_split.c utils/ft_strcmp.c utils/ft_strdup.c utils/ft_strjoins.c utils/ft_strlen.c utils/ft_substr.c utils/prints.c main.c +SRCS = srcs/ft_close.c srcs/ft_dups.c srcs/ft_execve.c srcs/ft_fork.c srcs/ft_open.c srcs/ft_pipe.c srcs/ft_waits.c builtins/cd.c builtins/echo.c builtins/env.c builtins/export.c builtins/helpers.c builtins/pwd.c builtins/shell_exit.c builtins/unset.c builtins/utils.c execution/environment.c execution/execute.c execution/heredoc.c execution/misc.c execution/paths.c execution/shell.c execution/signals.c parsing/commands.c parsing/commands_list.c parsing/env.c parsing/expand.c parsing/expand_env.c parsing/free.c parsing/heredoc.c parsing/lexer.c parsing/operator.c parsing/parser.c parsing/heredoc_expansion.c parsing/parsing_utils.c parsing/token_list.c parsing/word_spliting.c utils/alpha.c utils/contains.c utils/fatal.c utils/ft_atoi.c utils/ft_calloc.c utils/ft_exit.c utils/ft_free.c utils/ft_itoa.c utils/ft_memcpy.c utils/ft_split.c utils/ft_strcmp.c utils/ft_strdup.c utils/ft_strjoins.c utils/ft_strlen.c utils/ft_substr.c utils/prints.c main.c SRCS_DIRS = $(dir $(SRCS)) BIN_DIR = bin/ @@ -22,11 +22,11 @@ NAME = minishell all: $(NAME) $(NAME): $(OBJS) - @$(CC) -L/goinfre/$(USERS)/.brew/opt/readline/lib -I/goinfre/$(USERS)/.brew/opt/readline/include -lreadline $(OBJS) -o $(NAME) + @$(CC) -g -L/goinfre/$(USERS)/.brew/opt/readline/lib -I/goinfre/$(USERS)/.brew/opt/readline/include -lreadline $(OBJS) -o $(NAME) $(BIN_DIR)%.o: %.c $(INCLUDES) @$(MKDIR) $(OBJS_DIRS) - $(CC) $(LINK) $(CFLAGS) -c $< -o $@ + $(CC) $(LINK) $(CFLAGS) -c $< -g -o $@ clean: @$(RM) $(BIN_DIR) diff --git a/builtins/echo.c b/builtins/echo.c index 2be2969..2c2f7b8 100644 --- a/builtins/echo.c +++ b/builtins/echo.c @@ -27,7 +27,7 @@ void echo(char **args, int fd) ft_putstr_fd("\n", fd); return ; } - if (is_flag_n(args[i])) + while (args[i] && is_flag_n(args[i])) { new_line = FALSE; i++; diff --git a/builtins/unset.c b/builtins/unset.c index a0f975e..0e636fb 100644 --- a/builtins/unset.c +++ b/builtins/unset.c @@ -27,7 +27,10 @@ int unset(char **args, int fd) return (1); } if (!ft_strcmp(*args, "_")) + { + args++; continue ; + } pop_env(*args); args++; } diff --git a/execution/shell.c b/execution/shell.c index 41064a9..b80faae 100644 --- a/execution/shell.c +++ b/execution/shell.c @@ -38,9 +38,3 @@ void shell_loop(void) free(line); } } - -void set_exit_status(int sig) -{ - (void)sig; - ft_putchar_fd('\n', 1); -} diff --git a/execution/signals.c b/execution/signals.c index e6d1d6d..8a7955a 100644 --- a/execution/signals.c +++ b/execution/signals.c @@ -53,7 +53,7 @@ void ignore_signals(void) struct sigaction sa_sigint; struct sigaction sa_sigquit; - sa_sigint.sa_handler = &set_exit_status; + sa_sigint.sa_handler = SIG_IGN; sa_sigquit.sa_handler = SIG_IGN; sigaction(SIGINT, &sa_sigint, NULL); sigaction(SIGQUIT, &sa_sigquit, NULL); diff --git a/includes/parsing.h b/includes/parsing.h index 7f6c48b..d427b3f 100644 --- a/includes/parsing.h +++ b/includes/parsing.h @@ -80,5 +80,7 @@ void free_token_word(t_token *token, char *word); void check_and_redirect(int *inf_out, int fd); void free_all(t_token *tokens); int handle_heredocs(t_cmd *cmd, t_token *tokens); +int get_name_len(char *token, int i); +char *heredoc_expansion(char *line); #endif // PARSING_H diff --git a/parsing/heredoc.c b/parsing/heredoc.c index 812e8d2..5f7e603 100644 --- a/parsing/heredoc.c +++ b/parsing/heredoc.c @@ -68,7 +68,7 @@ int handle_heredoc(t_cmd *cmd, char *limiter, char *file) while (line && ft_strcmp(line, limiter)) { if (expand_mode && *line) - line = parameter_expansion(line); + line = heredoc_expansion(line); joined_line = ft_strjoin(line, "\n"); write(fd, joined_line, ft_strlen(joined_line)); free(line); diff --git a/parsing/heredoc_expansion.c b/parsing/heredoc_expansion.c new file mode 100644 index 0000000..55254be --- /dev/null +++ b/parsing/heredoc_expansion.c @@ -0,0 +1,96 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* heredoc_expansion.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: mtagemou +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/06 12:59:34 by mtagemou #+# #+# */ +/* Updated: 2023/02/06 12:59:36 by mtagemou ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +char *get_name_here(char *token) +{ + int i; + int name_len; + + i = 0; + name_len = -1; + while (token[i]) + { + name_len = -1; + if (token[i] == '$') + name_len = get_name_len(token, i); + if (name_len == 0) + token[i] = -1; + if (name_len > 0) + break ; + i++; + } + if (name_len == 0 || name_len == -1) + return (NULL); + return (ft_substr(token, i, i + name_len)); +} + +int replace_before_name_here(char *new_token, char *token) +{ + int i; + + i = 0; + while (token[i] != '$') + { + new_token[i] = token[i]; + i++; + } + return (i); +} + +char *replace_name_value_here(char *token, char *name, char *value) +{ + char *new_token; + int i; + int j; + int k; + + i = 0; + j = 0; + new_token = ft_calloc(ft_strlen(token) + + (ft_strlen(value) - ft_strlen(name)) + 1); + i = replace_before_name_here(new_token, token); + k = i; + j = 0; + while (value[j]) + { + if (value[j] == '$') + value[j] = -1; + new_token[i++] = value[j++]; + } + k += ft_strlen(name); + while (token[k]) + new_token[i++] = token[k++]; + free(token); + return (new_token); +} + +char *heredoc_expansion(char *line) +{ + char *name; + char *value; + char *new_line; + + name = get_name_here(line); + if (!name) + { + expands_dollars_dollars(line); + return (line); + } + value = get_env_value(name + 1); + new_line = replace_name_value_here(line, name, value); + if (*(name + 1) == '?') + free(value); + free(name); + return (heredoc_expansion(new_line)); +} diff --git a/path/ls b/path/ls new file mode 100755 index 0000000..d3a354e Binary files /dev/null and b/path/ls differ